1. 程序开发过程:编辑、编译预处理、编译、连接、运行。
2. 比较 #include“file.h”VS. #include<file.h>
当用#include“file.h”时,先搜索当前工作目录,如果没有,再去搜索标准库,库没有再搜索资源库;
当用#include<file.h>时,编译器先从标准库开始搜索,如果没再搜索资源库目录,若还未找到则搜索当前工作目录。
题中的两种方式都会找到stdio.h(存在于标准库),通过<>,(库里)一步就找到了。
两者在程序的执行速度上一样,但是在编译速度上不同。
3. 友元能够通过类的对象访问类的所有成员。(正确)
(友元相当于在一个盒子上开了一个洞,既然一个盒子有洞,那么你就可以拿出这个箱子的任何东西。)
4. C++的虚函数必须是类的一个成员,而不允许是类的友元。
5. 调用拷贝构造函数的3情况:
1)、用一个对象去初始化同一个类的另一个新对象时;
2)、函数的形参对象,调用函数进行形参和实参结合;
3)、函数的返回值是类的对象,函数执行返回调用时 将一个对象赋值给另一个对象,两个对象都存在,调用的是赋值构造函数,不涉及内存的分配。 当被赋值的对象不存在调用的是拷贝构造函数;
6. 分析下列程序,则构造函数中,成员变量一定要通过初始化列表初始化的是:bc
class A{
...
private:
int &a;
};
class B:public A{
...
private:
int a;
public:
const int b;
A c;
static const char *d;
A* e;
};
分析一:需要初始化列表的三种:引用、const和没有默认构造函数的成员对象。
c需要初始化不是因为它的成员有引用,而是因为类A中没有合适的构造函数。
d,底层const,允许改变d的值,亦可不必初始化。
e,指向的东西是可变的,只要满足类A中要求即可。指针与引用的区别,定义一个引用时候必须要初始化,而且不能改变。定义一个指针时候,不用初始化,还可以更改指向。
const、引用在初始化列表中初始化。static在类外初始化。 普通变量可以在初始化列表也可以在构造函数里面赋值
分析二:常量成员和引用成员自然是要初始化的,问题就在这static成员。 static成员是不允许在类内初始化的,除了const,那么static const 成员是不是在初始化列表中呢? 答案是NO
一是static属于类,它在未实例化的时候就已经存在了,而构造函数的初始化列表,只有在实例化的时候才执行。
二是static成员不属于对象。我们在调用构造函数自然是创建对象,一个跟对象没直接关系的成员要它做什么呢。
还有一个问题就是上面那个仁兄说的,需要初始化的数据成员是对象(继承时调用基类构造函数) ;这个显然是不对的。下面代码能够很好说明了这个问题。c需要初始化不是因为它是类对象,是因为他的成员有引用。
class A { private: int a; };
class B : public A{
private:
int aa;
public: B(int i ):aa(i),b(9){};
const int b;
A c;
};