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 ...
随机推荐
- manjaro运行virtualbox报错
manjaro运行virtualbox报错manjaro使用添加删除程序搜索virtualbox安装后运行报错, 安装过程有选择modules的过程(这里要选择匹配当前系统内核的版本),当时不了解是干 ...
- C++学习(七)(C语言部分)之 输入
输入学习时的笔记(其实也没什么用,留着给自己看的) 输出是指 把内容打印到控制台窗口 输入是指 把内容输入到程序里 scanfscanf 从键盘获取内容到程序里格式占位符+变量要加取地址符 1.格式占 ...
- 20165313 《Java程序设计》第八周学习总结
教材学习总结 线程常用方法 1.start() 2.run()定义线程线程对象被调度之后所执行的操作 3.sleep(int millsecond),必须在try-catch语句块中调用sleep方法 ...
- LeetCode – All Nodes Distance K in Binary Tree
We are given a binary tree (with root node root), a target node, and an integer value K. Return a li ...
- Js 向表单中添加多个元素
@{ ViewBag.title = "地图导航"; } @model YT.XWAJ.Public.Application.MapNavigation.Dto.MapNaviga ...
- struts2 中的数据访问servletAPI
ActionContext包含其他数据对象,包括值栈 每次请求都会创建一个ActionContext对象 通过ActionContext访问数据 在action中读取 在jsp页面中读取 1 ...
- YUM安装调试以及命令具体解释
背景,须要安装cacti,google了非常多安装资料.须要先yum安装一些准备lib包,比方snmp以及openssl等等. [root@mysqlvm2 ~]# yum install net-s ...
- DevExpress使用方法GridControl总结
1.隐藏最上面的GroupPanel gridView1.OptionsView.ShowGroupPanel=false; 2.得到当前选定记录某字段的值 sValue=Table.Rows[gri ...
- NPOI之Excel——设置单元格背景色
NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...
- ThinkPHP3.2 where方法的使用
where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括普通查询.表达式查询.快捷查询.区间查询.组合查询在内的查询操作.where方法 ...