读书笔记(一)
c++类中不允许复制构造函数是传值参数
#include <iostream>
class A {
private:
int value;
public:
A(int n) {
value = n;
}
A(A a) { // erro: 传值参数
value = a.value;
}
void print(){
std::cout << value << std::endl;
}
}; // class A
int main() {
A a(10);
A b = a;
b.print();
}

这段代码是无法编译的,因为如果是传值参数,那么实参到形参会调用复制构造函数,如果允许值传递那么,复制构造函数内部也会
调用复制构造函数,从而无限的递归调用导致栈溢出。这里应该改为常量引用。const &。
sizeof空类型实例
#include <iostream>
class A{};
int main() {
A a;
std::cout << sizeof(a) << std::endl;
}
sizeof空类型的实例时,输出结果为1。本来sizeof空类型的实例时输出应该为0,但是声明该实例时需要要求在内存中占据一定空间。
至于用多少空间由编译决定。我这里输出的1是我当前使用的编译决定的。
sizeof带构造函数和普通析构函数的实例
#include <iostream>
class A{
public:
A(){}
~A(){}
};
int main() {
A a;
std::cout << sizeof(a) << std::endl;
}
输出结果仍然是1,构造函数与虚构函数只与地址相关,而地址只与类型相关,而与类型实例无关,编译器不会应为这两个函数而在实例中添加任何额外信息。
#include <iostream>
class A{
public:
A(){}
~A(){}
void Print(){}
};
int main() {
A a;
std::cout << sizeof(A) << std::endl;
}
同理添加任意的普通成员函数,sizeof的结果都是一样的。编译器不会因为普通成员函数而向实例中添加多余的信息。
sizeof带virtual关键词成员函数的类的实例时
#include <iostream>
class A{
public:
A(){}
virtual ~A(){}
void Print(){}
};
int main() {
A a;
std::cout << sizeof(A) << std::endl;
}
我是64位机,结果为8,编译器发现有虚函数存在,就会为该类型生成一个虚函数表,并且每有一个实例生成
还会为该实例生成一个指向虚表的指针。
#include <iostream>
class Base{
public:
virtual void Print_base(){}
};
class A : public Base{
public:
A(){}
virtual ~A(){}
virtual void Print(){}
};
class C {
public:
virtual void Print1(){}
};
class D : public Base{
public:
void Print2(){}
};
class B : public A, public C, public D{
public:
void Print() override{
}
};
int main() {
A a;
std::cout << sizeof(a) << std::endl;
B b;
std::cout << sizeof(b) << std::endl;
}
这段代码的输出结果为
8
24

浙公网安备 33010602011771号