C/C++笔试易错题+图解知识点(二)—— C++部分(持续跟新中)

目录

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 

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);
}

C/C++笔试易错题+图解知识点(二)—— C++部分(持续跟新中)_第1张图片

初始化列表初始化:

#include 

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);
}

C/C++笔试易错题+图解知识点(二)—— C++部分(持续跟新中)_第2张图片

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

你可能感兴趣的:(笔试/面试,c++,开发语言)