首页 > 试题广场 >

如果定义如下类: class Empty{} 请

[单选题]
如果定义如下类:
class Empty{}
请选择编译器为之生成的函数有哪些? (    )

1.Empty() { … }
2.Empty(const Empty& rhs){ … }
3.Empty& operator=(const Empty& rhs) { … }
4.~Empty() { … }
  • 124
  • 1234
  • 123
  • 14
class Empty  
{  
  public:  
    Empty();                            //缺省构造函数  
    Empty(const Empty &rhs);            //拷贝构造函数  
    ~Empty();                           //析构函数   
    Empty& operator=(const Empty &rhs); //赋值运算符  
    Empty* operator&();                 //取址运算符  
    const Empty* operator&() const;     //取址运算符(const版本)  
};  

发表于 2017-09-29 22:25:13 回复(0)
《Effective C++》条款05
声明一个空类之后,编译器就会自动的为他声明一个copy构造函数,一个copy assignment操作符和一个析构函数。
此外如果没有声明任何构造函数,编译器也会自动声明一个default构造函数。所有这些函数都是public且inline的。
编辑于 2017-09-21 15:54:29 回复(6)
这道题的答案是错误的,正确的答案应该是没有任何函数被生成,《深入理解c++对象模型》中讲到,如果一个类不是派生类,也没有抽象数据成员和虚函数,那该类称之为“无意义的”,这样的类的拷贝初始化等等都像基本类型一样,如果给他默认生成构造函数等反而会降低效率。有如下运行效果佐证:
不添加构造函数时:

其汇编代码如下:
可以看到MyClass cls;语句并没有执行任何额外的指令,也就是说没有生成默认构造函数。
以下代码添加了构造函数:

相应的汇编代码如下:

可以看到这里调用了构造函数。所以你不显示地添加构造函数,在这种情况下是不会给你自动生成构造函数的,析构函数、拷贝构造和赋值运算符也一样。
编辑于 2017-10-14 22:01:23 回复(5)
来自黑马程序员老师C++核心编程4.5.4的教案:
c++编译器至少给一个类添加4个函数

1. 默认构造函数(无参,函数体为空)
2. 默认析构函数(无参,函数体为空)
3. 默认拷贝构造函数,对属性进行值拷贝
4. 赋值运算符 operator=, 对属性进行值拷贝
发表于 2023-05-30 23:20:55 回复(0)
In C++03 there are 4:
Default constructor: Declared only if no user-defined constructor is declared. Defined when used
Copy constructor - declared only if the user hasn't declared one. Defined if used
Copy-assignment operator same as above
Destructor same as above

In C++11 there are two more:
•Move constructor
•Move-assignment operator
发表于 2020-03-14 18:35:14 回复(0)
class Empty  
{  
  public:  
    Empty();                     //缺省构造函数  
    Empty(const Empty &rhs);             //拷贝构造函数  
    ~Empty();                     //析构函数   
    Empty& operator=(const Empty &rhs);          //赋值运算符  
    Empty* operator&();               //取址运算符  
    const Empty* operator&() const;          //取址运算符(const版本)  
};  

发表于 2021-08-09 19:42:20 回复(1)
默认构造函数
拷贝构造函数
赋值运算符
析构函数
发表于 2021-03-23 10:26:16 回复(0)
classEmpty  
{  
  public:  
    Empty();                            //缺省构造函数  
    Empty(constEmpty &rhs);            //拷贝构造函数  
    ~Empty();                           //析构函数   
    Empty& operator=(constEmpty &rhs); //赋值运算符  
    Empty* operator&();                 //取址运算符  
    constEmpty* operator&() const;     //取址运算符(const版本)  
};  
发表于 2018-08-02 10:47:35 回复(0)
参考别人的:《Effective C++》条款05
声明一个空类之后,编译器就会自动的为他声明一个copy构造函数,一个copy assignment操作符和一个析构函数。
此外如果没有声明任何构造函数,编译器也会自动声明一个default构造函数。所有这些函数都是public且inline的。
编辑于 2018-02-02 10:38:47 回复(0)
默认的赋值运算 返回值是引用吗 为什么不可能是值?
发表于 2017-09-17 09:27:30 回复(3)