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#开发的基础,重 ...
随机推荐
- Qt中各个widget前后位置的设定(在Qt中,所有问题都要一分为二,QWidget体系和QGraphicsWidget体系)
这两天在总结一些以往project中遇到的问题,正好别组有同事问我关于Qt中各个widget窗口的前后位置是如何定义的,这里就总结一下: 在Qt中,所有问题都要一分为二,讨论两种不同的情况:一个是最常 ...
- mysql timestamp 值不合法问题
Create Table: CREATE TABLE `RecruitmentDesc` ( `sn` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号(自增字段 ...
- Http静态资源的缓存
最近一段时间一直在研究页面缓存和压缩方面的东西,由于公司服务器使用的是iis6.0,很多性能方面的优化都不支持.所以,就开始尝试着自己写个简单的处理程序. 为了减少服务器带宽的需求,我们要减少客户端与 ...
- MyEclipse修改
MyEclipse设置编码方式 http://www.cnblogs.com/susuyu/archive/2012/06/27/2566062.html Eclipse添加Spket插件实现ExtJ ...
- 网易云课堂_C语言程序设计进阶_第四周:ACL图形库
创建ACLLib程序 #include"acllib.h" #include<stdio.h> int Setup1() { initWindow(, );//初始化窗 ...
- javascript第一课javascript:void(0);
在一些需要使用<a href="#"></a>的地方,把#号换成javascript:void(0); 可以防止在链接跳转到新页面,void(0)放里面的参 ...
- 数据结构中La表的数据合并到Lb表中
实验描述:La表中的数据为(3,5,8,11) Lb 表中的数据为(2,6,8,9,11,15,20) 将La表中的数据而不存在Lb表的数据插入到Lb表中,从而实现并集操作. 出现的问题:最后实现的 ...
- Radio Link Failure and Recovery
四种会发生Radio Link Failure的场景 - DL Physical Layer Failure (PDCCH BLER > 10%) - Random Access Probl ...
- malloc 申请得到的内存后,再 free 释放它的时候,操作系统会立即收回那块内存吗?
stackoverflow上的回答: In many malloc/free implementations, free does normally not return the memory to ...
- B - 确定比赛名次
B - 确定比赛名次 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit S ...