目录
关于重载函数,哪个说明是正确的()
A 函数名相同,参数类型或个数不同
B 函数名相同,返回值类型不同
C 函数名相同,函数内部实现不同
D 函数名称不同
函数重载:在相同的作用域中,函数名字相同,参数列表不同的一些列函数称为函数重载。
参数列表不同具体的体现:参数个数不同,参数类型不同,类型的次序不同
注意:函数返回值类型是否相同没有关系。和函数内部的实现没有关系。
A
下列情况中,不会调用拷贝构造函数的是()
A 用一个对象去初始化同一个类的另一个新对象时
B 将类的一个对象赋值给该类的另一个对象时
C 函数的形参对象,调用函数进行形参和实参结合时
D 函数的返回值是类的对象,函数执行返回调用时
概念:是一个特殊的构造函数,是单参的,参数的类型必须是类类型&一般情况下会使用const来进行修饰。 A(const A&a)
调用时机:当用已经存在的队形构造新的对象的时候,编译器会自动地调用拷贝构造函数
A a1; A a2(a1); //拷给构造函数
void Func(A a)//在传参时也会调用拷贝构造函数
A Fun() { A a; //这个返回的a也是拷贝构造 return a; }B:a1=a2注意:其中调用的是赋值运算符重载。这个a1并不是新创建的,而是之前就已经存在的,所以是赋值运算符重载,仅仅是将a2的值拷贝给a1
B
以下代码共调用多少次拷贝构造函数:
- Widget f(Widget u)
- {
- Widget v(u);
- Widget w=v;
- return w;
- }
- main(){
- Widget x;
- Widget y=f(f(x));
- }
A 1
B 3
C 5
D 7
y对象的构造将来也需要调用构造函数。
y=f(f(x))我们先需要调用内部的这个f(x),这个内部的x传递给f函数的u,调用了一次拷贝构造函数,然后用u来拷贝构造v,就是两次拷贝构造函数,然后用来拷贝构造w(这里并不是赋值运算符的重载,因为是用已经存在的对象创建新的对象),也就是第三次拷贝构造。然后w在返回的时候需要构造一个临时的返回对象,又调用了一次拷贝构造,也就是第四次拷贝构造。然后这个内部的f(x)的拷贝构造就完成了。然后我们将这个内部的临时对象再传给我们的u,也就是第五次拷贝构造,然后u拷贝构造生成了v,是第六次拷贝构造,然后再用v构造w就是第七次拷贝构造,然后再w返回的时候,又需要创建一个临时对象进行返回,也就是第八次拷贝构造,然后用这个临时变量的返回值返回给y,也就是创建了y这个对象,也就是需要九次拷贝构造。
但是这里是没有九这个选项的。
注意:当函数返回值是一个类类型对象时,编译器可能会对返回值类型进行优化,所以就不生成这个返回的临时的返回对象,而是直接将这个w返回,也就是优化了两次,所以是七次
D
如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是()
A 一元运算符
B 二元运算符
C 选项A)和选项B)都可能
D 重载错误
当用户定义了一个类之后,然后先要通过该类的对象直接使用某种运算符--编译器是不支持的。
原因:类对象中可能有多个成员,在用该类的对象进行响应的运算符操作时,该如何处理,编译器是不知道的。
比如 Date类有两个对象d1 d2
我们想知道这两个日期的时间差d1-d2,我们的编译器其实并不知道如何计算,这时候我们就需要将运算符进行重载
运算符重载:
1.重载成类的成员函数--性参数目看起来比该运算符需要的参数少了一个(因为成员数有隐藏的this)
2.重载成类的友元函数 (必须有一个参数是类类型的对象)
(下面的代码取自我们这篇博文中第二部分的内容)
(C++【类和对象】【三】_桜キャンドル淵的博客-CSDN博客)
所以我们题目中的参数表中没有任何的参数,所以重载就直接报错了。
D
在main 函数中,变量 a 和 b 的构造函数和析构函数的调用顺序是()
- class A;
- class B;
- int main() {
- A a;
- B b;
- return 0;
- }
A b构造 - a构造 - a析构 - b析构
B a构造 - a析构 - b构造 - b析构
C b构造 - a构造 - b析构 - a析构
D a构造 - b构造 - b析构 - a析构
我们构造的对象是在栈上的,也就是说,我们的a先构造了,然后b再构造,然后析构的时候,由于我们栈的特性,先进入的后出,后进入的先出,所以我们的b先析构,然后再a析构
D