空类的默认函数—— SAP电面(2)/FEI

定义一个空类

class Empty
{
};

默认会生成以下几个函数

2. 拷贝构造函数

Empty(const Empty& copy)
{
}

3. 赋值运算符

Empty& operator = (const Empty& copy)
{
}

4. 析构函数(非虚)

~Empty()
{
}

这些函数只有在第一次使用它们的时候才会生成,他们都是inline并且public的。如果想禁止生成这些函数,可以将它们定义成private函数,如果有很多类都有这种需求,那么可以定义一个基类,然后让其他类继承这个类。下面是来自boost库的代码,任何继承了该类的类,都不能进行复制操作。也不能使用赋值运算符。

 1 #ifndef BOOST_NONCOPYABLE_HPP_INCLUDED
 2 #define BOOST_NONCOPYABLE_HPP_INCLUDED
 3
 4 namespace boost {
 5     //  Private copy constructor and copy assignment ensure classes derived from
 6     //  class noncopyable cannot be copied.
 7     //  Contributed by Dave Abrahams
 8     namespace noncopyable_  // protection from unintended ADL
 9     {
10         class noncopyable
11         {
12         protected:
13             noncopyable() {}
14             ~noncopyable() {}
15         private:  // emphasize the following members are private
16             noncopyable( const noncopyable& );
17             const noncopyable& operator=( const noncopyable& );
18         };
19     }
20
21     typedef noncopyable_::noncopyable noncopyable;
22
23 } // namespace boost
24
25 #endif  // BOOST_NONCOPYABLE_HPP_INCLUDED

转载:http://www.cnblogs.com/graphics/archive/2010/07/14/1776950.html

时间: 2024-07-31 15:06:30

空类的默认函数—— SAP电面(2)/FEI的相关文章

C++类的默认函数

在C++中,一个类有八个默认函数: 默认构造函数: 默认拷贝构造函数: 默认析构函数: 默认重载赋值运算符函数: 默认重载取址运算符函数: 默认重载取址运算符const函数: 默认移动构造函数(C++11): 默认重载移动赋值操作符函数(C++11).   只是声明一个空类,不做任何事情的话,编译器会自动为你生成一个默认构造函数.一个默认拷贝构造函数.一个默认重载赋值操作符函数和一个默认析构函数.这些函数只有在第一次被调用时,才会被编译器创建,当然这几个生成的默认函数的实现就是什么都不做.所有这

C++中的空类,默认产生哪些类成员函数。

1. 默认成员函数 Class Empty { public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty(); // 析构函数 Empty& operator=( const Empty& ); // 赋值运算符 Empty* operator&(); // 取址运算符 const Empty* operator&() const; // 取址运算符 const }; 2. 类可以有多个拷贝

C++的空类中默认产生哪些类成员函数

1 class Empty 2 { 3 public: 4 Empty(); 5 Empty(const Empty&); 6 ~Empty(); 7 Empty & operator =(const Empty &); 8 Empty * operator &(); 9 contt Empty * operator &() contst; 10 }

C++ 空类默认产生的类成员函数

C++的空类有哪些成员函数:. 缺省构造函数.. 缺省拷贝构造函数.. 缺省析构函数.. 缺省赋值运算符.. 缺省取址运算符.. 缺省取址运算符 const.     注意:有些书上只是简单的介绍了前四个函数(宝典4th p112).没有提及后面这两个函数.但后面这两个函数也是空类的默认函数(Ref:<effective c++>).另外需要注意的是,只有当实际使用这些函数的时候,编译器才会去定义它们. //C++ 空类默认产生的类成员函数: //缺省构造函数,拷贝构造函数,析构函数,赋值运算

【C++缺省函数】 空类默认产生的6个类成员函数

1.缺省构造函数. 2.缺省拷贝构造函数. 3. 缺省析构函数. 4.缺省赋值运算符. 5.缺省取址运算符. 6. 缺省取址运算符 const. <span style="font-size:18px;"> class A { public: A(){}//缺省构造函数 A(const A&){}//拷贝构造函数 ~A(){}//析构函数 A&operator=(const A&){}//赋值运算符 A*operator&(){}//取址运算

C++空类编译器自动生成的6个成员函数

一.问题 在C++中,编译器会为空类提供哪些默认成员函数?分别有什么样的功能呢? 二.详解 1.空类,声明时编译器不会生成任何成员函数 对于空类,编译器不会生成任何的成员函数,只会生成1个字节的占位符. 有时可能会以为编译器会为空类生成默认构造函数等,事实上是不会的,编译器只会在需要的时候生成6个成员函数:一个缺省的构造函数.一个拷贝构造函数.一个析构函数.一个赋值运算符.一对取址运算符和一个this指针. 代码: [html] view plaincopy #include <iostream

C++空类编译器自动生成的6个成员函数、关于构造函数、拷贝构造函数的解释

对于空类,编译器不会生成任何的成员函数,只会生成1个字节的占位符. 有时可能会以为编译器会为空类生成默认构造函数等,事实上是不会的,编译器只会在需要的时候生成6个成员函数:默认构造函数.默认拷贝构造函数.默认析构函数.默认赋值运算符 这四个是我们通常大都知道的.但是除了这四个,还有两个,那就是取址运算符和 取址运算符 const. class Empty { public: Empty(); //缺省构造函数 Empty(const Empty &rhs); //拷贝构造函数 ~Empty();

堆(stack) 之 c 和 c++模板实现(空类默认成员函数 初谈引用 内联函数)

//stack 的基本操作 #include <iostream> using namespace std; const int maxn = 3; typedef struct Stack { //NumType num; int num; }Stack; int top = 0;//当前元素位置的上一个元素 Stack stack[maxn]; bool is_empty(); bool is_full(); int pop(); void push(const int &key)

一个空类被编译器编译后产生了哪些默认函数

为何空类的大小不是0呢? 为了确保两个不同对象的地址不同,必须如此. 类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址. 同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了. 所以,空类的sizeof为1,而不是0. 一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function, 如果你写 class A{}; 编译器处理后,就相当于: class A { public: A()