`
lc52520
  • 浏览: 361526 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

C++隐式成员函数2【Z】

阅读更多

1 编译器自动生成的基本函数
C++编译器会在开发人员没有声明下列函数的时候,声明编译器自己的版本。

class Empty{}

等效于下面的声明

class Empty{
public:
Empty(); //缺省构造函数
Empty(const Empty& rhs); //拷贝构造函数
~Empty(); //析构函数
Empty & operator=(const Empty& rhs); //赋值运算符
Empty & operator&(); //取址运算符
const Empty * operator&() const;
}

下面是编译器的参考实现

inline Empty::Empty() {}
inline Empty::~Empty() {}
inline Empty* Empty::operator&() { return this; }
inline const Empty* Empty::operator&() const { return this; }

Empty::Empty(const Empty& rhs); //对类的非静态数据成员进行“以成员为单位的”逐一拷贝构造(赋值)。

2 防止拷贝和赋值
如果我们不想编写拷贝构造函数和赋值函数,又不允许别人使用编译器生成的缺省函数:
一种方法是:只需将拷贝构造函数和赋值函数声明为私有函数,不用编写代码;

class Empty{
private:
Empty(const Empty& rhs); //拷贝构造函数
Empty & operator=(const Empty& rhs); //赋值运算符
}

3 在派生类中实现类的基本函数
基类的构造函数,析构函数,赋值函数都不能被派生类继承。如果类之间存在继承关系,在编写上述基本函数时应该注意如下事项:
派生类的构造函数应在其初始化表里调用基类的构造函数。
基类与派生类的析构函数应该为虚(即加virtual关键字)。
编写派生类的赋值构造函数时,注意不要忘记对基类的数据成员重新赋值。

分享到:
评论

相关推荐

    C++ dll隐式加载函数和类,显示加载函数和类,嵌套加载函数和类,

    C++,如何调用其他动态库中的函数或类成员函数?由隐式加载和显示加载,还有嵌套加载,嵌套加载即调用的dll中还调用了其他dll,麻烦但原理一样,故没写。 注:请打开build文件夹下的sln文件,打开src下的sln文件相对...

    c++builder隐式连接DLL

    简单的c++builder隐式连接DLL,初学者可以瞅瞅

    c++隐式类型转换示例分享

    主要介绍了c++隐式类型转换的二个示例,需要的朋友可以参考下

    C++ 多个类的DLL封装以及隐式链接和显式链接2种方法调用

    C++ 多个类的DLL封装以及隐式链接和显式链接2种方法调用

    C++类成员和数据成员初始化总结

    1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员 2.进入构造函数后在构造函数中执行一般计算 1.类里面的任何成员变量在定义时是不能初始化的。 2.一般的数据成员可以在构造函数中初始化。

    画隐式函数的Matlab程序

    该程序适用于用matlab画隐式函数的图,只需要输入函数表达式即可。很方便实用!

    C++隐式类类型转换

    C++可以定义如何将其他类型的对象隐式转换为我们的类类型或将我们的类类型的对象隐式转换为其他类型。为了定义到类类型的隐式转换,需要定义合适的构造函数。  说明:可以用单个实参来调用的构造函数定义了从形参...

    C++隐式转换问题分析及解决办法

    在本篇文章里小编给大家整理了关于C++隐式转换问题分析及解决办法,有需要的朋友们可以学习下。

    类的转换C++的内部数据类型遵循隐式类型转换规则

    类的转换,C++的内部数据类型遵循隐式类型转换规则,成员转换函数

    C++ 隐式转换带来的问题

    编译器经常会背着我们做一些我们不希望发生的事情,典型的是隐式转换。不过庆幸的是,编译器只会帮助我们进行一次转换,而不会无休止的隐式转换,直至满足条件为止。例如,下面先定义一个Array模板类: template...

    C++隐式类型转换运算符operator type()用法详解

    主要介绍了C++隐式类型转换运算符operator type()用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    改变隐式加载dll路径的方法实例代码

    通过SetDllDirectory可以灵活的设置隐式加载dll的路径,详见源代码.vs2005编译

    C++初始化函数列表详细解析

    在以下三种情况下需要使用初始化成员列表: ...若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。(也就是这三种情况

    C++ string类的隐式共享写时拷贝实现代码

    本人采用C++实现的string类,采用的内存管理策略是隐式共享写时拷贝,其实现参考了智能指针的思想。

    新手学习C++入门资料

    标准C++中的字符串类取代了C标准C函数库头文件中的字符数组处理函数。 C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库。 C++中的try/catch/throw异常处理机制取代了标准C中的setjmp()和...

    C语言中的隐式函数声明

    1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下面是一个例子: int main(int argc, char** argv...

    Effective C++

    条款27:如果不想使用隐式生成的函数要显示的禁止它 条款28:划分全局名字空间 4、类和函数:实现 条款29:避免返回内部数据的句柄 条款30:避免这样的成员函数,其返回值是指向成员的非CONST指针或引用 条款31:千万不要...

Global site tag (gtag.js) - Google Analytics