2020年最全面的C++复习大纲!面向对象程序设计,建议收藏( 四 )


如果父类是一个无缺省参数的构造函数 , 那么对于派生类一旦没有构造函数 , 那么就不会自动地先构造父类的构造函数 , 这是不允许的 。
派生类中一定要有构造函数 。
BaseballTeam(const string s[], int si) : Team(si)
派生类的构造函数通过初始化列表 , 对基类进行初始化 。
21.构造函数的作用是什么?什么时候会被调用?构造函数的执行顺序是什么(父类与子类的构造函数、类自身与其数据成员的构造函数)?
构造函数主要用来在创建对象时初始化对象 ,即为对象成员变量赋初始值 。
当类被创建时 , 自动调用 。
【2020年最全面的C++复习大纲!面向对象程序设计,建议收藏】执行构造函数的顺序:
父类的构造函数
数据成员的初始化(成员中有类 , 执行该类的构造函数)
子类的构造函数
22.什么是类作用域(Class scope)、文件作用域(file scope)、函数作用域(function scope)?
类作用域:
类是有名成员的集合 , 类X的成员m具有类作用域 , 对成员m的访问方式有如下三种:
1)如果X的成员函数中没有声明同名的局部作用域标识符 , 那么可以直接使用成员m
2)通过表达式x.m或X::m(访问静态成员)
3)通过ptr->m , 其中ptr为指向X类的一个对象的指针
文件作用域:
在函数外部声明的变量只在当前文件范围内(包括文件内所有定义的函数)可用
在其他文件不可用 。 要使变量具有文件作用域 , 必须在变量的声明前加static关键字 。
当多个源文件链接成一个程序时 , static可以避免一个文件中的全局变量与其它文件中的变量同名而发生冲突 。
函数作用域:
(1)指在函数定义或者复合语句中 , 从标识符的定义点开始到函数或者一对话括号之间的程序段 。
(2)在同一个局部作用域内不能出现相同名字的两个局部变量(包括形参) 。
(3)一个函数内的复合语句又是一个局部作用域 , 也就是在函数内有某个变量时 , 复合语句中可以有另外一个同名字的变量 。
23.为什么拷贝构造函数(copy constructor)的参数必须是按引用传递(by reference)而不能是按值传递(by value)?
1.无限递归调用:
当一个对象需要以值方式传递时编译器会生成代码调用它的拷贝构造函数以生成一个副本 。 如果类A的拷贝构造函数是以值方式传递一个类A对象作为参数的话 , 当需要调用类A的拷贝构造函数时 , 需要以值方式传进一个A的对象作为实参;而以值方式传递需要调用类A的拷贝构造函数;结果就是调用类A的拷贝构造函数导致又一次调用类A的拷贝构造函数 , 这就是一个无限递归 。
2在某些状况下 , 类内成员变量需要动态开辟堆内存 , 如果实行位拷贝 , 也就是把对象里的值完全复制给另一个对象 , 如A=B 。 这时 , 如果B中有一个成员变量指针已经申请了内存 , 那A中的那个成员变量也指向同一块内存 。 这就出现了问题:当B把内存释放了(如:析构) , 这时A内的指针就是野指针了 , 出现运行错误 。
24.拷贝构造函数(复制构造函数)的作用是什么?什么是浅拷贝?什么是深拷贝?(google)
复制构造函数由编译器调用来完成一些基于同一类的其他对象的构件及初始化 。
浅拷贝只是对指针的拷贝 , 拷贝后两个指针指向同一个内存空间 , 深拷贝不但对指针进行拷贝 , 而且对指针指向的内容进行拷贝 , 经深拷贝后的指针是指向两个不同地址的指针 。
25.全局对象(Global scope objects)的构造函数、析构函数分别是什么时候被调用的?
自动局部对象(Automatic local objects)的构造函数、析构函数分别是什么时候被调用的?
静态局部对象(static local objects)的构造函数、析构函数分别是什么时候被调用的?
a.全局变量构造函数程序运行前被调用 , 在main()函数返回后才被中对象才被销毁 , 析构函数在程序结束前最后被调用 。
b.自动局部变量 , 当程序执行到对象定义时 , 调用自动局部对象的构造函数 。 该对象的析构函数在对象离开范围时调用(即离开定义对象的块时) 。 自动对象的构造函数与析构函数在每次对象进入和离开范围时调用 。
c.静态局部对象的构造函数只在程序执行首次到达对象定义时调用一次 , 对应的析构函数在main终止或调用exit函数时调用 。
26.什么是初始化列表(Initialization Sections)?它的作用是什么?(提示:一般数据成员的初始化、常成员的初始化 , 对象成员构选函数的选择、父类构造函数的选等) 。