effective c++(05)(06)之c++默默编写并调用的函数
1. 当只写一个空类的时候,编译器会为他声明一个copy构造函数,一个copy assignment函数和一个析构函数。如下:
如果写下:
class Empty{ };
编译器就会实现以下代码:
class Empty{
Empty(){} //默认构造函数
Empty(const Empty& rhs ) {} //复制构造函数
~Empty() {} //析构函数
Empty& operator=( const Empty& rhs ) {} // 复制赋值操作符
};
编译器产生的是non-virtual函数。默认产生以上四种构造函数。
如果要使这些编译器默认产生的函数失效则提供了以下两种方法:
一. 将这些函数声明为private。如下:
class Empty{
public:
private:
Empty(const Empty& rhs ) {}
};
此时如果进行如下调用:
Empty e1;
Empty e2(e1);
return ;
编译器就不会允许。但是这种情况在member函数或者friend函数内进行的时候就可以做到。
二. 为了能够保证所有的成员以及类不能够拷贝对象,需要定义以下类:
class Uncopyable{
protected:
Uncopyable() {}
~Uncopyable(){}
private:
Uncopyable( const Uncopyable& );
Uncopyable& operator=( const Uncopyable& );
};
然后使
class Empty:private Uncopyable{
.......
};
这样,当任何人(甚至是member函数或者friend函数)尝试拷贝Empty对象时,编译器试着生成一个copy构造函数和一个copy assignment操作符,而这些函数却尝试着调用base class对应的兄弟,此时编译器便拒绝操作。
2.
class NamedObject{
public:
NamedObject( const char* name, const T& value );
NamedObject( const string& name, const T& value );
private:
string nameValue;
T objectValue;
};
NamedObject<int> no1( "Smallest Prim Number", );
NamedObject<int> no2(no1);
编译器已经为NamedObject类定义了copy构造函数,所以 NamedObject<int> no2(no1) 就调用了该copy构造函数。
3.
template< typename T >
class NamedObject{
public:
NamedObject( const string& name, const T& value ); private:
string& nameValue;
const T objectValue;
};
string newDog("persephone");
string oldDog("Satch");
NamedObject<int> p( newDog, );
NamedObject<int> s( oldDog, );
p = s;
c++不允许“让reference”指向不同的对象。如果打算在一个内含有“reference”成员的class内支持赋值操作,必须要定义一个copy assignment操作符。同样对于内含const的成员的类,更改const也是不合法的。
4. 如果某个base class将copy assignment声明为private,编译器也拒绝为其derived classes生成copy assignment操作符。因为编译器为derived classes生成的copy assignment操作符可以处理base class成分。
总结:编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment操作符以及析构函数。
effective c++(05)(06)之c++默默编写并调用的函数的更多相关文章
- Effective C++条款05:了解C++默默编写并调用哪些函数
class Empty{}; class Empty{ Empty(){}; Empty(const Empty& rhs){}; ~Empty(){}; Empty& operato ...
- 条款05:了解C++默默编写并调用哪些函数
每一个class都会有一个或多个构造函数.一个析构函数.一个copy assignment操作符.这些控制着基础操作,像是产出新对象并确保它被初始化.摆脱旧对象并确保它被适当清理.以及赋予对象新值. ...
- 【05】了解C++默默编写并调用那些函数
1.如果没有声明copy构造方法,copy赋值操作符,和析构方法,编译器会自动生成这些方法,且是inline. 2.如果没有声明任何构造方法,编译器会自动生成一个default构造方法,且是inlin ...
- Effective C++ 条款五 了解C++默默编写并调用哪些函数
//申明一个类时,编译器会默认为你提供四个函数. //无参构造函数,析构函数,copy构造函数,copy assignment操作符. template <typename T> ...
- Effective C++ 之 Item 5:了解C++默默编写并调用哪些函数
Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 5 ...
- EC笔记,第二部分:5.了解C++默默编写并调用哪些函数
5.了解C++默默编写并调用哪些函数 1.C++空类 C++会为一个空类建立以下函数 (1).默认构造函数 (2).默认拷贝构造函数 (3).析构函数 (4).赋值运算符(如果成员包含引用类型或con ...
- Effective C++学习笔记 条款05:了解C++默默编写并调用的哪些函数
一.如果用户没有提供构造函数.copy构造函数.copy assignment操作符和析构函数,当且仅当这些函数被需要的时候,编译器才会帮你创建出来.编译器生成的这些函数都是public且inline ...
- Effective C++ -----条款05:了解C++默默编写并调用哪些函数
面对“内含reference成员或者含const成员”的class内支持赋值操作,你必须自己定义copy assignment操作符. 如果某个base classes将copy assignment ...
- [Effective C++ --005]了解C++默默编写并调用哪些函数
<前言>编译器是个十分敬业的工作者,不但为你编译代码,甚至为你生成代码,不可思议吧.本文主要介绍编译器究竟会为我们生成和调用哪些代码. <空类和非空类>如果问什么样的类是空类? ...
随机推荐
- A Tour of Go Methods with pointer receivers
Methods can be associated with a named type or a pointer to a named type. We just saw two Abs method ...
- 解决eclipse 使用run运行,始终会跳到debug模式!
查看此选项是否选择中卫always,若是,更改为never或prompt,重启eclipse即可
- NGUI学习笔记(四):动态加载UI和NGUI事件
动态加载UI 我们进入一个场景后,如果将这个场景所有可能用到的UI都直接放在场景中做好,由于要在进入场景时就部署好所有的UI对象,那么当UI对象较多时会碰到的问题是:1.初始化场景会产生非常明显的卡顿 ...
- .NET代码编写规范 整理
.NET代码编写规范 整理 .NET代码编写规范 - [ASP.NET] 2009-02-26 | Tag: 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://lensp ...
- java Swing图形化界面
学过java的人应该对java的图形化界面很是反感,特别是接触java不久的人.如果想和其他语言那样用鼠标拖拽,可以使用wondosbulider插件.但是用起来也不是那么方便.当然对于不乐意写代码的 ...
- Winfrom巧用Using设置鼠标为WaitCursor
本文转载:http://www.cnblogs.com/LoveJenny/archive/2013/03/13/2956922.html 看到try,finally ,有没有让你想到什么呢?,对了u ...
- 域名的MX设置及校验方法
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- ios基础知识
1获取系统语言设置 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; NSArray *languages = ...
- 逻辑网络(Logical Network)
Introduction The VMM documentation indicates that “A logical network is used to organize and simplif ...
- C#/Access-数据库获取自动编号的最大值
//conStrSQL你改成你的access,我这里用的SQL2005string conStrSQL = "Data Source=xx.xx.xx.xx;Initial Catalog= ...