day5

发布时间 2023-08-25 00:30:38作者: skural

 

D b2=func(b1);//10 一次拷贝构造函数发生在func函数调用完成,返回B类型的对象时,因为返回的不是引用类型,所以会生成一个对象, 不妨称为TEMP,将返回的对象通过拷贝构造函数复制给TEMP,然后,返回值所对应的对象会被析构。如果返回值是引用类型, 则不会调用拷贝构造函数。 赋值运算符在func函数执行完成后,将上面提到的TEMP,通过赋值运算符赋值给b2,值得注意的是赋值运算符重载函数如果不自己定义, 程序会认为是调用缺省的赋值运算符重载函数。

 

按位取反只需要一个操作数,所以 B 选项错误,左移一位是原操作数的 2 倍,其他情况不是,比如左移两位就是原操作数的 4 倍,所以 C 选项错误,右移运算时,高位在某些情况下不是补 0

 

  正确答案C,我第一次选的A,因为在函数模板中,体化时可以不给定模板实际参数,编译器自动识别进行体化,而在类模板的体化中,与函数模板不同,类模板的体化必须给定模板实际参数,如:A<T>
  a; 所以本例编译不通过,考的就有这个知识点。
 那为什么D错了,还是回到前面讲的类模板的体化格式诸如 A<T> a;
 A是一个模板, A加上<T>以后:A<T>这个整体才是我们要的“类”,所以是语法错误

 

C++规定=,[ ],(),->这四个运算符只能被重载为类的非静态成员函数,其他的可以被友元重载,主要是因为其他的运算符重载函数都会根据参数类型或数目进行精确匹配,这四个不具有这种检查的功能,用友元定义就会出错。

 

  拷贝函数和构造函数没有返回值,A错; 
 
  拷贝构造函数的参数可以使一个或多个,但左起第一个必须是自身类型的引用对象,B错;
 
 
  若类定义中没有声明拷贝构造函数,则编译器会自动生成一个缺省的拷贝构造函数,但是不会是该类的保护成员,C错。 

 

编译器不为const分配内存空间,而是直接保存在符号表中,没有了内存读取操作,效率就提高了。编译器会对const进行安全类型检查,define由于没有类型所以无法进行类型检查
#define在预处理阶段替换,使用该常量的都要拷贝,没有类型安全检查,所以在字符替换的时候可能会出现边际效应。而const定义的常量有类型名,放在静态区,在编译期,只有一个拷贝,节省内部空间和内存读取。so,选B