C++基础知识梳理--C++的6个默认函数
C++有六个默认函数:分别是
1、default构造函数;
2、默认拷贝构造函数;
3、默认析构函数;
4、赋值运算符;
5、取值运算符;
6、取值运算符const;
// 这两个类的效果相同 class Person
{} class Person
{
public:
Person() {...} // deafault构造函数;
Person(const Person&) {...} // 默认拷贝构造函数
~Person() {...} // 析构函数
Person& operator = (const Person &) {...} // 赋值运算符
Person *operator &() {...} // 取值运算符
const Person *operator &() const {...} // 取值运算符const
}
下面这个例子展现的是默认函数的调用方式;
例:
Person.h #ifndef PERSON_H
#define PERSON_H
#include <iostream>
#include <string> using namespace std; class Person
{
public:
Person(); // deafault构造函数;
Person(const Person&); // 默认拷贝构造函数
~Person(); // 析构函数
Person& operator = (const Person &); // 赋值运算符
Person *operator &(); // 取值运算符
const Person *operator &() const; // 取值运算符const public:
string getName() { return sName; }
string getCode() { return sCode; } void setName(string name);
void setCode(string code); void printInfo();
private:
string sName;
string sCode;
}; #endif // PERSON_H
Person.cpp #include "Person.h" Person::Person()
{
cout << "运行:default构造函数;" << endl;
} Person::Person(const Person &src)
{
cout << "运行:copy构造函数;" << endl;
sName = src.sName;
sCode = src.sCode;
} Person::~Person()
{
cout << "运行:析构函数;" << endl;
} Person &Person::operator =(const Person &src)
{
cout << "运行:赋值运算符;" << endl;
sName = src.sName;
sCode = src.sCode;
return *this;
} Person *Person::operator &()
{
cout << "运行:取址运算符;" << endl;
return this;
} const Person *Person::operator &() const
{
cout << "运行:取址运算符const;" << endl;
return this;
} void Person::setName(string name)
{
sName = name;
} void Person::setCode(string code)
{
sCode = code;
} void Person::printInfo()
{
cout << "Name : " << sName << endl;
cout << "Code : " << sCode << endl << endl;
}
main.cpp #include <iostream> #include "Person.h" using namespace std; int main()
{
// 创建a
Person a;
a.setName("李明");
a.setCode(""); // 创建b
Person b(a);
b.setCode(""); // 创建c
Person c;
c = b;
c.setCode(""); // 创建d
Person *d;
d = &a;
d->setCode(""); // 输出
a.printInfo();
b.printInfo();
c.printInfo();
d->printInfo();
return ;
}
输出结果:

只声明一个空类而不去使用时,编译器会默认生成:
1、default构造函数; 2、默认拷贝构造函数; 3、默认析构函数; 4、赋值运算符;
构造函数:
构造函数用于创建对象,对象被创建时,编译系统对对象分配内存空间,并自动调用构造函数。
构造函数运行的过程是:
1、系统创建内存空间,调用构造函数;
2、初始变量表;
3、函数体部分运行;
copy构造函数:
构造函数的一种,在C++中,下面三种对象需要拷贝的情况,拷贝构造函数将会被调用。
1、 一个对象以值传递的方式传入函数体
2、 一个对象以值传递的方式从函数返回
3、 一个对象需要通过另外一个对象进行初始化
一般来说copy构造函数被重写是为了处理默认拷贝构造函数(bitwise copy)不能完成的情况;这些情况大多来自深拷贝和浅拷贝的区别;
析构函数:
在对象析构时被掉用,用于析构对象,释放内存;
赋值运算符:
赋值运算符存在的意义就是可以快速简单的用一个类对一个类进行赋值;从赋值这一点上来说同copy构造函数十分相似;可以将copy构造函数看作是构造函数和赋值运算符的组合。
注意的是:必须返回 *this,也就是做操作数的引用;
如何禁用这些函数?
所有的默认函数都是public的并且是inline的;所以希望外界不能调用的话,就将这些函数申明成private类型,但是这回出现什么后果呢?
我只能说呵呵了,试试吧。
C++基础知识梳理--C++的6个默认函数的更多相关文章
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
- Anliven - 基础知识梳理汇总 - 软件测试
基础知识梳理 - 软件测试 - 概念 基础知识梳理 - 软件测试 - 分类 基础知识梳理 - 软件测试 - 流程 基础知识梳理 - 软件测试 - 用例 基础知识梳理 - 软件测试 - 方法 基础知识梳 ...
- [C# 基础知识梳理系列]专题六:泛型基础篇——为什么引入泛型
引言: 前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...
- java基础知识梳理
java基础知识梳理 1 基本数据类型
- C#基础知识梳理索引
C#基础知识梳理索引 一 引子 之前曾写了一篇随笔<.NET平台技术体系梳理+初学者学习路径推荐+我们的愿景与目标> 三个月过去了,目标使更多的编程初学者,轻松高效地掌握C#开发的基础,重 ...
随机推荐
- support.SerializationFailedException: Failed to deserialize payload.
support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of c ...
- ADB几种常见的错误及解决方法
下面列举出几种常见的错误及解决方法. Q1:无效的安装包,安装包已损坏[INSTALL_FAILED_INVALID_APK] A1:请检查安装包是否完整.如果是xpk包,可以通过 手动安装xpk来检 ...
- PS学习
PS快捷键大全(转自UI中国PS教程) 摆脱鼠标流就靠这张图了!!!! 查看图像 使用导航器查看图像 选择窗口-->导航器 菜单命令 使用缩放工具查看图像 ctrl++ 以画布大小放大图像 ct ...
- 自学JQuery Mobile的几个例子
JQuery Mobile是一个用于构建移动Web应用程序的框架,适用于主流的移动设备(智能手机.平板电脑),该框架利用了HTML5和CSS3技术减少了额外的脚本文件的编写.具体JQuery Mobi ...
- Kettle 学习笔记
一直用SSIS做ETL,越来越感觉这玩意不是亲生的.因此萌生换ETL工具的想法,不过Kettle社区版没什么调度系统,貌似错误处理也不是很方便,且先了解吧. 本文简略的记录了整个软件的使用流程. 开始 ...
- 经典SQL语句集锦
下列语句部分是MsSql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELET ...
- osg项目经验1<MFC+OSG中模型点选效果>
点选主要是重载osg的GUIEventHandler, class CPickHandler : public osgGA::GUIEventHandler{ //自定义回调函数名:CPickHand ...
- find: missing argument to `-exec'
man find 发现 花括号要加 '' find ${LOG_BASE_DIR}$dir/ -type f -mtime +${KEEP_DAYS} -name ${LOG_REG} -exec r ...
- Java学习之基本数据类型
基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型.它们是我们编程中使用最频繁的类型.java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化. 1. Java ...
- ORA-31626:作业不存在 ORA-31633:无法创建主表"XXX.SYS_IMPORT_FULL_05"
错误代码: ORA-31626:作业不存在 ORA-31633:无法创建主表"XXX.SYS_IMPORT_FULL_05" ORA-06512:在"SYS.DBMS_S ...