29、拷贝构造函数什么时候会被调用?
(1)用=定义变量时会调用拷贝构造
(2)将一个对象作为实参传递给一个非引用类型的形参
(3)从一个返回类型为非引用类型的函数返回一个对象
(4)用花括号列表初始化一个数组中的元素或者一个聚合类中的成员
30、为什么C++中的拷贝构造函数的形参只能使用引用传递?
(1)如果使用值传递的话,那么调用拷贝构造函数的时候,首先需要将实参传递给形参,这个传递的时候又要调用拷贝构造函数,这样就会造成无限递归,最后发生栈溢出,但事实上编译器在语法检查上就已经是禁止这种行为的。
(2)如果使用指针传递,这样定义的构造函数实际是一个自定义的有参构造函数,而并非拷贝构造。拷贝构造函数只有一个,如果自定义了拷贝构造函数,编译器直接调用自定义的拷贝构造,否则编译器会自动合成一个。(详细可以看另一篇博客:为什么C++中的拷贝构造函数的形参不能使用值或者指针传递?
31、C++中类成员的访问权限
C++通过public、protected、private三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的,受保护的,私有的,被称为成员访问的限定符。但是这种访问权限只是针对类外的,类内没有访问权限,都是可以互相访问的。类外只能通过对象访问成员,并且只能访问public属性的成员。
(1)public:可以被该类中的函数,子类的函数,友元函数访问,也可以被该类的对象在类外访问;
(2)protected:可以被该类中的函数,子类的函数,友元函加粗样式数访问,但是不能被该类的对象在类外访问;
(3)private:可以被该类中的函数,友元函数访问,但是不能被子类的函数,该类的对象访问。
32、struct和class的区别
(1)在C++中,可以用struct和class定义类,都可以继承,在C语言中只有struct没有class;
(2)struct的默认继承权限和默认访问权限是public,但是class的默认继承权限和默认访问权限是private;
(3)class还可以作为模板类的形参,比如template<class T,int i>
33、C++面向对象的三大特征是什么?
(1)封装:将客观事物封装为抽象的类,而类可以把自己的数据和方法暴露给可信的类或者对象,对不可信的类或者对象则进行信息的隐藏。
(2)继承:可以使用现有类的所有功能,并且无需重新编写原来的类既可对功能进行拓展。
(3)多态:一个类实例的相同方法在不同情况下有不同的表现形式,使不同内部结构的对象可以共享相同的外部接口。
34、动态绑定是如何实现的?
当编译器发现类中有虚函数时,会创建一张虚函数表,把虚函数的函数入口地址放到虚函数表中,并且在对象中增加一个指针vptr,用于指向类的虚函数表。当派生类覆盖基类的虚函数时,会将虚函数表中对应的指针进行替换,从而调用派生类中覆盖后的虚函数,从而实现动态绑定。
35、为什么基类的构造函数不能定义为虚函数?
虚函数的调用依赖于虚函数表,而指向虚函数表的指针vptr需要在构造函数中进行初始化,所以无法调用定义为虚函数的构造函数。