目录
一.static修饰类域中的私有变量
其定义不能使用初始化列表定义,因为每初始化一个实例对象都要调用初始化列表。static定义在类外(该类的下面)代码如下 _year变量:
class A{
private:
static int _year;
int _month;
public:
};
int A::_year = 1;
int main() {
return 0;
}
二.static修饰成员函数
用static修饰成员函数不会传this指针,这也就导致这个函数不能访问类中的储存在栈上的私有变量,只能访问储存在静态区的定义在类中的私有的static修饰的变量和函数。在类中由static修饰的变量属于这个类的每一个对象。如下图案例:
三.内置类型转成自定义类型
内置类型会先去调用该自定义类型的构造函数产生一个临时的对象,再将对象拷贝构造给自定义类型对象。如果不想发生隐式转换则可以在构造函数前加explicit关键字。如下代码所示:
代码运行结果为12
class A{
private:
static int _year;
int _month;
public:
A(int month) {
_month = month;
}
void print() {
cout << _year<<_month << endl;
}
};
int A::_year = 1;
int main() {
A a = 2;
a.print();
return 0;
}
加explicit不能隐式转但是六月强制转换,运行结果依然是12。
class A{
private:
static int _year;
int _month;
public:
explicit A(int month) {
_month = month;
}
void print() {
cout << _year<<_month << endl;
}
};
int A::_year = 1;
int main() {
A a = (A)2;
a.print();
return 0;
}
四.友元函数
1)友元关键字会导致低耦合。
2)友元类不能传递,如a是b的友元,b是c的友元,但是a不是c的友元。
五.内部类
内部类能够访问外面的私有化成员变量,内部类的外部能够访问内部类的公有化变量。
六.编辑器对构造实例的优化
一般在同一个表达式中,或者在函数的直接传参调用中。vs2019一般是如下优化:
1)构造函数+构造函数 -> 构造函数
2)构造函数+拷贝构造 -> 构造函数
3)拷贝构造+拷贝构造 -> 拷贝构造
注意不同的编辑器可能优化程度不同,越新的编译器优化的越厉害。
七.new和delete关键字
1)new的本质是调用operator new和构造函数初始化对象,delete的本质是调用operator delete和析构函数释放空间。
2)operator new本质是调用了malloc函数加上外封装抛出异常,operator delete的本质是调用了free加上外封装抛出异常。
3)new 自定义类型 [10] 这时会多开首四个字节空间用于存放开辟的元素个数,用于delete[] 对象的时候知道调用多少次析构函数释放对象空间。