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#开发的基础,重 ...
随机推荐
- [原]容器学习(一):动手模拟spring的IoC
介绍 学习经典框架的实现原理以及设计模式在其实际中的运用,是非常有必要的,可以让我们更好进行面向对象. 本篇文章就来模拟Spring的IOC功能,明白原理后,可以更好的使用它,进而为进行面向对象提供一 ...
- 一步一步学android之布局管理器——RelativeLayout
今天开始学习RelativeLayout(相对布局),相对布局在平时布局的时候用的较多,因为Android适配方面的原因.相对布局可以控制组件摆放的位置(放在任一组件的上下左右等位置),下面来看看类的 ...
- SICP 练习 (2.9)解决摘要:宽度和区间运算的关系间隔
SICP 2.9 像是一个数学题,要我们证明区间的和与差的宽度是被加和被减的区间的宽度的函数,而对于乘法和除法来说不成立. 书中所谓宽度就是区间起点和终点差的一半.以我看来更像是区间宽度的一半.无论怎 ...
- Objective-C官方文档翻译 Block
版权声明:原创作品,谢绝转载!否则将追究法律责任. 一个Objective-c类定义了一个对象结合数据相关的行为.有时候,这使得他有意义的表达单个任务或者单元的行为.而不是集合的方法. blocks是 ...
- oracle添加用户及权限
CREATE USER qdcenter 用户名 IDENTIFIED BY qdcenter 密码 DEFAULT TABLESPACE data1 默认表空间 TEMPORARY TABLE ...
- 关于ECMAScript6一些知识
ECMAScript 是当前 JavaScript 语言规范的最新标准,一般称为 es6, 但是因为 该标准规范是在 2015年6月份发布的,所以也叫作 ECMAScript 2015 let 变量声 ...
- java中关于线程间协作所用关键字synchronized,wait,notify的用法
wait/notify()关键字适用于一个线程通知另一个线程所需的条件状态已就绪,最常用于线程在循环中休眠直到获取特定条件的场景. 例如,一个线程一直等待直到队列中有一个组件能够处理:当组件添加到队列 ...
- 错误提示:在此上下文中不允许使用名称 "***"。有效表达式包括常量、 常量表达式和变量(在某些上下文中),不允许使用列名。
出现这种情况的原因,是因为在SQL语句的编写格式不正确. 事例展示: 错误: string sql = "insert into person ([name], sex, salary) v ...
- (转)MapReduce 中的两表 join 几种方案简介
1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的.而在HADOOP中进行JOIN操作,同样常见且耗时,由于Hadoop的独特设计思想,当进行JOIN操作时,有一些特殊的 ...
- iOS内购的订单对应和补单
内购的关键类: 1.SKPayment(SKMutablePayment可将自己的参数一对一与苹果产生的payment对应起来) 2.TransactionObserver:交易状态更新时执行此方法, ...