一:this指针
class Stutent
{
private:
int number;
string name;
public:
string name() { return name; }
};
在上面的代码中,假设定义一个对象Stutent limei; 然后执行limei.name(),则会返回对象limei的成员变量name。成员函数name()通过this指针判断是哪个对象的name。this是一个隐式参数,是一个指向调用函数的对象的地址的指针,this的类型是Stutent * const this (注意顶层const指针的声明中解引用符号的位置)。当执行limei.name()的时候,等价于执行Student::name(&limei)。而函数部分return name 等价于return this->name。
二:类作用域和成员函数
编译器分两步编译类,首先编译成员的声明,然后才是编译成员函数体。
三:构造函数初始值列表
设有一个类,类名叫做Person,则下面这行代码定义了一个默认构造函数,其中=default是c++11的新标准。
Person() = default;
四:访问控制与封装
class和struct关键字的区别就是,前者的默认访问权限是private,后者的默认权限是public
友元函数只要在类内的声明前加上friend关键字,该函数就可以访问类的私有成员。如下所示,函数print访问了类A的私有成员。程序输出是0
class A
{
private:
int data = 0;
public:
friend void print(A a);
};
void print(A a) { cout << a.data; }
int main(int argc, char *argv[])
{
A a;
print(a);
while (1) {}
}
五:在类内使用类型别名
例如下面代码中定义的类Screen,其中pos是size_type的类型别名,用typedef定义。
class Screen
{
public:
typedef string::size_type pos;
Screen();
~Screen();
private:
pos cursor = 0;
pos height = 0, width = 0;
string contents;
};
六:一些细节的补充
class Screen
{
public:
typedef string::size_type pos;
Screen() = default;
Screen(pos ht, pos wd, char c) :height(ht), width(wd), contents(ht*wd, c) {}
~Screen();
char get() const { return contents[cursor]; }
inline char get(pos ht, pos wd) const;
Screen &move(pos r, pos c);
private:
pos cursor = 0;
pos height = 0, width = 0;
string contents;
};
在上面的代码中,第四行的pos是定义的类型别名;第五行要特意声明默认构造函数,因为第六行声明了带参数的构造函数会掩盖默认构造函数惹;如果函数体定义在类中,那么该函数就是内联函数,例如代码中的不带参数的get函数,当然内联函数也可以显示声明,例如带参数的get函数。
七:const成员函数也能修改成员变量吼。
class Screen
{
public:
void func() const;
private:
mutable int mute_times = 0;
};
void Screen::func() const
{
mute_times++;
}
这里func函数是能够修改mute_times的啦,人家毕竟有mutable修饰惹。
八:又要定义不修改成员变量的 成员函数,又希望能够返回非常量的对象引用
九:不完全类型
class A
{
public:
A *left;
A *right;
A left2;
A right2;
};
如上代码所示,当出现名字A后,该类就相当于已经声明了,但是直到最后一个花括号结束,该类才算被定义。在这之间,类被声明但是没有被定义,称之为不完全类型。对于不完全类型,可以定义该类型的指针或者引用,但是不允许定义该类型的对象。所以left和right的定义是合法的,而left2和right2的定义是非法的。
十:头文件循环包含
这几个链接中已经写的很明白了:
https://blog.csdn.net/cqu20093154/article/details/48374447
https://blog.csdn.net/wuchuanpingstone/article/details/52384933
https://blog.csdn.net/sinat_36053757/article/details/64444556
友元声明的作用是影响访问权限,但他不是普通意义上的声明,即如果要使用友元必须另作声明才可。