读书笔记(一)

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
posted @ 2022-02-14 13:19  cyssmile  阅读(37)  评论(0)    收藏  举报