目录
1.构造函数初始化列表
1.1 构造函数初始化列表与函数体内初始化区别
1.2 必须在初始化列表初始化的成员
2. 引用初始化以后不能被改变,指针可以改变所指的对象
1.构造函数初始化列表
有一个类A,其数据成员如下: 则构造函数中,成员变量一定要通过初始化列表来初始化的是:______。
class A { ... private: int a; public: const int b; float* &c; static const char* d; static double* e; };
A. a b c
B. b c
C. b c d e
D. b c d
E. b
F. c
答案:B
知识点:
1.1 构造函数初始化列表与函数体内初始化区别
一个类,其包含一个类类型成员,对于它的构造函数,如果在函数体内初始化,会先调用其类类型成员的默认构造函数,在调用赋值运算符,而在构造函数初始化时会直接调用它的拷贝构造函数进行初始化
函数体类初始化:
#include <iostream>
class B {
public:
B() { std::cout << "B defualt construct" << '\n'; }
B(int t) : _t(t) { std::cout << "B construct" << '\n'; }
B(const B& b) : _t(b._t) { std::cout << "B copy construct" << '\n'; }
B& operator=(const B& b) {
_t = b._t;
std::cout << "B assign operator"<< '\n';
return *this;
}
private:
int _t = 0;
};
class A {
public:
A() { std::cout << "A defualt construct" << '\n'; }
A(const B& b){
puts("---------------------");
_b = b;
std::cout << "A construct" << '\n';
}
A(const A& a) : _b(a._b) { std::cout << "A copy construct" << '\n'; }
A& operator=(const A& a) {
_b = a._b;
std::cout << "A assign operator" << '\n';
return *this;
}
private:
B _b;
};
int main() {
B b(1);
A a(b);
}
初始化列表初始化:
#include <iostream>
class B {
public:
B() { std::cout << "B defualt construct" << '\n'; }
B(int t) : _t(t) { std::cout << "B construct" << '\n'; }
B(const B& b) : _t(b._t) { std::cout << "B copy construct" << '\n'; }
B& operator=(const B& b) {
_t = b._t;
std::cout << "B assign operator"<< '\n';
return *this;
}
private:
int _t = 0;
};
class A {
public:
A() { std::cout << "A defualt construct" << '\n'; }
A(const B& b) : _b(b) {
puts("---------------------");
std::cout << "A construct" << '\n';
}
/*A(const B& b){
puts("---------------------");
_b = b;
std::cout << "A construct" << '\n';
}*/
A(const A& a) : _b(a._b) { std::cout << "A copy construct" << '\n'; }
A& operator=(const A& a) {
_b = a._b;
std::cout << "A assign operator" << '\n';
return *this;
}
private:
B _b;
};
int main() {
B b(1);
A a(b);
}
1.2 必须在初始化列表初始化的成员
• const修饰的成员变量
• 引用类型成员
• 类类型成员,且该类没有默认构造函数(由1.1内容可得)
2. 引用初始化以后不能被改变,指针可以改变所指的对象
int main() {
int a = 10;
int& ref = a;
int b = 20;
ref = b;
std::cout << "a:" << a << " ref:" << ref << " b:" << b;
//output:a:20 ref:20 b:20
}
3 构造函数与析构函数系列题
3.1构造函数与析构函数的调用次数
C++语言中,类ClassA的构造函数和析构函数的执行次数分别为()
ClassA *pclassa=new ClassA[5]; delete pclassa;
A. 5,1
B. 1,1
C. 5,5
D. 1,5
答案:A