C++进阶--不让编译器自动生成类函数
//############################################################################
/*
* 不让编译器自动生成类函数
*
*
*
* 并不是所有的类都需要编译器自动生成类函数
*
* 例: 一个"OpenFile" 类表示一个被打开的文件。构造函数至少需要一个文件名作为参数
* 所有不需要默认构造函数
*/
那么如何让编译不自动生成函数
/*
* 对于C++ 11:
*/
class dog {
public:
dog(const dog& ) = delete; // 直接使用delete关键字即可
// 当资源不可共享时将拷贝构造禁用
}
/* 对于C++ 03:
*
1. Default constructor. - 简单
2. Copy constructor. - 见以下解决方法
3. Copy Assignment Operator. - 见以下解决方法
方法1:
将其声明为private函数,但是不定义它们
-- 对于成员和友元,会链接时错误,因为没有实现
-- 对于其他,会编译时错误
*/
class dog {
private:
dog& operator=(const dog& rhs);
};
/*
方法2:
在基类中,将其声明为private函数,但是不定义它们
-- 编译时错误
*/
class yellowdog : public dog {
};
int main() {
yellowdog y1("henry");
yellowdog y2;
y2 = y1;
}
// 注意:以上方法可以用于禁用任何函数
/* 问题:析构函数是否可以被禁用?使用场景?
*/
/* 方法 */
class dog {
public:
void destroyMe() { delete this; }
private:
~dog() { cout<< m_name.m_str << " is destroyed.\n" << endl; }
};
int main ()
{
dog* dog1 = new dog();
dog1->destroyMe();
}
/* 使用场景: 1. 引用计数的智能指针
* 2. 栈空间很小的嵌入式编程 //只能在堆上保存,因为如果是在栈上生成,堆栈rewind的时候肯定会调析构函数
*/
C++进阶--不让编译器自动生成类函数的更多相关文章
- Effective C++ 之 Item 6 : 若不想使用编译器自动生成的函数,就该明确拒绝
Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6 ...
- C++进阶--编译器自动生成的类函数
//############################################################################ /* 在C++ 03标准下 在没有显式定义 ...
- 【Effective c++】条款6:若不想使用编译器自动生成的函数就应该明确拒绝
地产中介卖的是房子,其使用的中介软件系统应该有个类用来描述卖掉的房子 class HomeFoeSale { ......} 但是任何房子都是独一无二的,不应该存在两个房子拥有同样的属性,因此以下操作 ...
- Effective C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 通常如果你不希望class支持某一特定机能,只要不声明对应函数就 ...
- C++如何拒绝编译器自动生成的函数
每一个class,编译器都会自动生成四个特殊成员函数: destructor(析构函数) default constructor(默认构造函数) copy constructor(copy构造函数) ...
- Effective C++ -----条款06:若不想使用编译器自动生成的函数,就该明确拒绝
为驳回编译器自动提供的功能,可将相应的成员函数声明为private并且不予实现. 使用像Uncopyable这样的base class也是一种做法(即先声明一个基类,然后私有继承它).这其实有点像使用 ...
- Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
一.为驳回编译器自动提供的机能,可将相应成员函数声明为private并且不予实现.(如果你仅仅是自己不实现的话,编译器会帮你实现) 如: class A { public: A(const strin ...
- Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
规则一 将成员函数声明为private而且故意不实现他们 class HomeForSale { public: ... private: ... HomeForSale(const HomeForS ...
- Effective C++ 条款六 若不想使用编译器自动生成的函数,就该明确拒绝
class HomeForSale //防止别人拷贝方法一:将相应的成员函数声明为private并且不予实现 { public: private: HomeForSale(const HomeForS ...
随机推荐
- 本地ip变化,自定义IP地址
1.打开网络和internet 设置 2.右键属性 3.修改
- Contest1036 - 2017西安电子科技大学程序设计新生赛网络预选赛
一名大三older 希望能帮助大一萌新...加油 xiandianer!!!!; xdoj 1260 (B) 水题 用了一下STL (好长啊...) #include<iostream> ...
- XXS level5
(1)用第四关的方法尝试,发现不行,查看页面源代码,发现on中间有了下划线 (2)查看PHP源代码 <?php ini_set("display_errors", 0); $ ...
- HDU 1160:FatMouse's Speed(LIS+记录路径)
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- java-Integer类
1.为什么会有基本类型包装类 * 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据. 2.常用操作 * 常用的操作之一:用于基本数据类型与字符串之间的转换. * Intege ...
- 《DSP using MATLAB》Problem 6.17
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- 《DSP using MATLAB》Problem 5.36
第1小题 代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- 给新创建的用户 赋予所有的权利 *.* 查看权限 删除用户 ---------DCL用户权限管理篇
第一步:进入数据库以后,先用 show databases; 再use mysql; 再 show tables; 再 select user,host from mysql.user; ...
- day 05JVM和深入理解java虚拟机
-----------------Java 虚拟机发展史 PS: Sun公司有 HotSpot, BEA公司有JRockit,IBM有 J9 这三个是高性能VM 在Oracle收购Sun和BEA这两 ...
- MySQL导出用户权限
在MySQL 5.5/5.6版本中,使用SHOW GRANTS命令可以导出用户的创建脚本和授权脚本. hostname='127.0.0.1' port= username='root' passwo ...