1.类中的static成员变量不占用类空间,并且const可以和static可以连用
struct B {
static const int x = 0;
};
int main() {
cout << sizeof(B) << endl;
}
结果为
2.C++拷贝构造函数分离
struct A {
int x=0;
A(int a) {
x = a;
}
explicit A(A& a) {
x = a.x;
}
A(const A& a) {
//x = a.x;
}
A& operator=(const A& a) {
this->x = a.x;
return *this;
}
};
int main() {
A a1(1);
A a2 = a1;
A a3(a1);
cout << a1.x << " " << a2.x<<" "<<a3.x;
return 0;
}
通过使用explicit和const关键字,可以对拷贝构造函数分离。
3.static与const区别
参考:const和static的区别 - 码农阿亮 - 博客园
需要值得注意的是const修饰局部变量是放在栈里面的,但是static修饰的局部变量还是放在全局/静态区的
4.虚函数中的默认形参
参考自:
C++虚函数中的默认参数_wb175208的博客-CSDN博客_虚函数的默认参数
虚函数默认参数选择_changbaolong的博客-CSDN博客_虚函数 默认参数
虚函数中尽量不使用默认形参,默认形参是编译时绑定的,派生类的形参还是会使用到基类的形参,这个要小心。
class base {
public:
virtual void print(int n = 5) {
cout << n << endl;
}
};
class derive:public base {
public:
virtual void print(int n = 4) {
cout << n << endl;
}
};
int main() {
base* b = new derive();
b->print();//打印的是5而不是4
return 0;
}
5.lambda表达式的空间占用
lambda表达式会被转换成匿名函数类,其捕获的参数会作为类的成员变量,因此lambda表达式的空间占用为其捕获的变量的大小(得注意考虑空间对齐)
int main() {
auto lambda1 = [=]() {
};
cout << sizeof(lambda1) << endl;//空类1个字节
int a = 9;
char ch = 5;
auto lambda2 = [=]() {
cout << a << ch << endl;
};
cout << sizeof(lambda2) << endl;//捕获了a跟ch,再考虑内存对齐,占用8个字节
}
6.虚函数可允许被声明为private并可被派生类重载
参考:C++虚函数(9) - 虚函数能否为private_水草的博客-CSDN博客_虚函数不能定义为private
C++虚函数及虚函数表解析_sanfengshou的博客-CSDN博客
虚函数虽然可被派生类继承并重载但是其只能通过将调用函数声明为友元函数的方式对虚函数进行调用,这一定程度上破坏了封装性。
(备注一个知识点:虚表指针应该是在构造函数当中绑定到自己的虚表的)
7.派生类继承虚函数可以不用加上override或者virtual关键字,可以用final在某一层禁止重载
class Base {
public:
virtual void a() { cout << "base" << endl; }
};
class Derived : public Base {
public:
virtual void a()final { cout << "Derived" << endl; }
};
class son : public Derived {
public:
void a() override { cout << "son" << endl; }//报错
};
8.析构函数是不允许有参数列表和返回值的
参考:
析构函数_wezzdo的博客-CSDN博客_析构函数的返回值类型
9.const修饰成员函数
参考自:C++之const修饰成员函数_软硬兼施的程序员的博客-CSDN博客_const修饰函数
1)const修饰函数只能修饰成员函数。
2)修饰成员函数时,在函数体中无法修改成员变量的值,只能读取。要使用成员变量的值须在变量定义时加上mutable关键字
3)const修饰的类变量只能调用类的const函数,但是对变量则没有限制。
10.以下两个类的空间大小均为16字节
struct Test {
int a, b;
double c;
char d[0];
};
struct Test1 {
int a, b;
double c;
char d[];
};