C++的类和This指针
类
一. 类的定义
//类的定义
class className
{
//类体:由函数和变量组成
};//一定要注意后面的分号
- class为定义类的关键字,className为类名,{}中为类的主体,注意类定义结束时后面的分号。
- 类中的元素为类的成员;类中的数据为类的成员变量;类中的函数为类的成员函数。
类的定义通常有两种方式:
a.类的声明和定义全部放在类体中。
// 声明和定义放在一起
class CTest
{
public:
CTest()
{
cout << "Creat CTest" << endl;
}
~CTest()
{
cout << "Destory CTest" << endl;
}
};
b.类的声明放在.h文件中,类的定义放在放在.cpp文件中。
// Test.h类的声明
class CTest(
{
public:
CTest();
~CTest();
};
// Test.cpp类的定义
CTest::CTest()
{
cout << "Create CTest" << endl;
}
CTest::~CTest()
{
cout << "Destory CTest" << endl;
}
C++中的struct和class有什么区别:
两个默认的访问权限不同,class是private型,而struct为public型(因为struct要兼容C)
二. 类的封装
C++的三大特性:封装、继承、多态
封装:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机的结合。
函数是封装的一种形式:函数中的语句被封装在函数本身这个更大的实体中,被封装的实体隐藏了它们的实现细节。可以调用该函数但是不可以访问函数中的语句。
访问限定符:public(公有)、private(私有)、protected(保护)
说明:
- public成员在类外可以直接访问。
- protected和private成员在类外不能够访问。
- 它们的作用域从该访问限定符出现的位置开始直到下一个访问限定符出现为止。
三、类的作用域
C++中的作用域:全局域、局部域、命名空间域、类域
类域
- 类定义了一个新的作用域,类的所有成员都必须处在类的作用域中。
- 形参表和函数体处在类的作用域中。
- 在类体外定义成员,需要使用::作用域解析符指明成员属于哪个类域。
- 在类的作用域外,只能够通过对象(或指针)借助成员访问操作符 “.” 和 ”->“ 来访问类成员,跟在访问操作符后面的名字必须在相关联类的作用域中。
//命名空间域
namespace N1
{
int a = 10;
void FunTest()
{
cout << "N1::FunTest()" << endl;
}
}
//全局域
int a = 20;
void FunTest()
{
cout << "::FunTest()" << endl;
}
//类域
class Test
{
public:
void Seta(int a)
{
_a = a;
}
void Geta()
{
cout << _a << endl;
}
private:
int _a;
};
int main()
{
Test t;
t.Seta(30);
cout << N1::a << endl; //10
cout << ::a << endl; //20
t.Geta(); //30
return 0;
}
This指针
一、This指针特性:
this指针的类型:类类型* const
This指针是一个常量,其内容不可以修改;但其所指向空间里的内容是可以改的。This指针并不是对象本身的一部分,不影响sizeof的结果。
注:一个类的大小,实际就是该类中“成员变量”之和。This的作用域在类“成员函数”的内部。
This指针是“类成员函数”的第一个默认隐含参数,编译器自动维护传递,类编写者不能显式传递。
只有在类的非静态成员函数中才可以使用this指针,其他函数都不可以。
二、_thiscall调用约定:
- _thiscall只能够用在类的成员函数上。
- 参数从右向左压栈。
- 如果参数个数确定,this指针通过 ecx寄存器传递给被调用者;
- 如果参数个数不确定(_cdecl),this指针在所有参数被压栈后压入堆栈。
三、面试题:
引用底层也是指针,此处为什么不是引用,而使用this指针?
答:引用是在1.0版本时才被加进来的。This指针可以为空吗?
答:可以
//this指针为空
class Test
{
public:
void FunTest() //相当于void FunTest(Test* const this)
{
value = 10; //相当于this->value ,而this指针为空,所以程序会发生崩溃
cout << "value=" << value << endl;
cout << "FunTest():" << this << endl; //打印出this指针的地址为空
}
int value;
};
int main()
{
Test* pt = NULL;
pt->FunTest(); //将pt的内容传给了this指针,所以此时this指针也为空
return 0;
}
空类的大小是多少?为什么?
答:空类的大小一般为1,是为了区分不同对象的。但也因编译器的不同其大小也可能不一样。C语言和C++中有哪些常用的调用约定?
答:_cdecl是C语言默认的函数调用方法:所有参数从右向左依次入栈,由调用者负责把参数压入栈,最后也是由调用者负责清除栈的内容。MS VC编译器就是采用此规则的。
_cdecl调用约定声明语法:
int function(int a, int b); //不加修饰的C调用约定
int _cdecl function(int a, int b); //明确指出C调用约定_stdcall是C++的标准调用方法:所有参数从右到左依次入栈,由调用者负责把参数压入栈,最后由被调用者负责清除栈的内容。
_stdcall调用约定的声明:
int _stdcall function(int a, int b);