C++类的默认成员函数
成员函数隐含this指针参数:
每成员函数一个隐式的指针形参(构造函数除外);
对象在调用成员函数时,编译器会将对象的地址传递给this指针;
1、构造函数(需用一个公有成员函数对私有的成员变量进行初始化,在对象构造时执行一次,无参的构造函数和带缺省值的构造函数都是缺省构造函数 ,缺省的构造函数只能有一个)
Mystring(const char *str="")//带缺省值的构造函数
{
_str = new char[strlen(str) + ];
strcpy(_str, str);
}
2、拷贝构造函数(使用同类对象来初始化;构造函数的重载;若未显示定,系统会调缺省的拷贝构造函数,缺省的拷贝构造函数会依次拷贝类成员进行初始化)
Mystring(const Mystring& s)
{
_str = new char[strlen(s._str) + ];
strcpy(_str, s._str);
}
Mystring s1;
拷贝构造函数的2种调用方式
Mystring s2(s1);
Mystring s3=s2;
但为什么拷贝构造函数传递的参数为引用呢?
使用传值传递会引发无穷递归调用,如上的调用方式,拷贝构造函数传入的参数为Mystring的一个实例s,由于是传值参数,所以会把形参s复制到实参s1又调用拷贝构造函数,所以会无穷的递归
3、析构函数(当一个对象的生命周期结束时,c++编译器会自动调用析构函数;负责做一些清理工作)
~Mystring()
{
if (_str)
delete[]_str;
}
4、赋值运算符的重载
Mystring& operator=(const Mystring& s)
{
if (this != &s)
{
char *tmp = new char[strlen(s._str) + ];
delete[] _str;
_str = tmp;
strcpy(_str, s._str);
}
return *this;
}
Mystring s4;
s4 = s1;
a、将返回值类型声明为该类型的引用,并在函数结束前返回实例自身的引用才能支持连续复制如(s1=s2=s3);?为什么
引用是左值(可以放在赋值运算符的左边),返回引用可以直接操作,也就可以进行连续赋值;所以s3将值复制给s2后,s2还能将值复制给s1
另外,引用作为返回值有以下几点:(使用值作为返回值会创建临时变量存储返回值,因为函数返回时局部变量会被释放必须用临时变量存储,指针也是如此,只不过临时变量里存 的时临时变量的地址。)
在类的成员函数中,返回引用的类对象,当然不能是函数内定义的类对象(会释放掉),一般为this指向的对象;
不要返回局部对象的引用 ,当函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。
b、将传入的参数申明为常量的引用,就不用调用拷贝构造函数以免不必要的消耗;
c、在分配新内存前释放自身已有的内存,以防内存泄露;
d、判断传入的参数和当前的实例(*this)是不是同一个实例,若为同一个实例时一旦释放内存,传入参数的内存也就被释放了,再也找不到需要复制的内容了。
C++类的默认成员函数的更多相关文章
- C++中的类继承(2)派生类的默认成员函数
在继承关系里面, 在派生类中如果没有显示定义这六个成员 函数, 编译系统则会默认合成这六个默认的成员函数. 构造函数. 调用关系先看一段代码: class Base { public : Base() ...
- C++类的const成员函数、默认的构造函数、复制形参调用函数(转)
C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...
- C++类的成员函数(在类外定义成员函数、inline成员函数)
类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...
- C++默认成员函数
1.什么是面向对象? 概念:(Object Oriented Programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法. 对象指的是类的实例,将对象作为程序的基本单元,将程 ...
- C++中的默认成员函数
一般而言,对于一个用户自定义的类类型,以下四个函数在用户没有自定义的情形下,会由编译器自动生成: 1.default constructor 2.copy constructor Someclass: ...
- 类1(this指针/const成员函数/类作用域/外部成员函数/返回this对象的函数)
假设我们要设计一个包含以下操作的 Sales_data 类: 1.一个 isbn 成员函数,用于返回对象的 book_no 成员变量 2.一个 combine 成员函数,用于将一个 Sales_dat ...
- 如何禁止C++默认成员函数
如何禁止C++默认成员函数 发表于 2016-03-02 | 分类于 C++ | 阅读次数 17 前言 前几天在一次笔试过程中被问到C++如何设计禁止调用默认构造函数,当时简单的想法是直 ...
- CDocument类的UpdateAllViews()成员函数
(一)UpdateAllViews() 与 Invalidate()的区别 UpdateAllViews()是在DOC/VIEW结构中,当一个视图的数据改变后,通知所有视图作相应的改变,和重画毫无关系 ...
- 友元(友元函数、友元类和友元成员函数) C++
有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员. 友元(frend)机制允许一个类将 ...
随机推荐
- 客户端相关知识学习(一)之混合开发,为什么要在App中使用H5页面以及应用场景、注意事项
混合开发 随着移动互联网的高速发展,常规的开发速度已经渐渐不能满足市场需求.原生H5混合开发应运而生,目前,市场上许多主流应用都有用到混合开发,例如支付宝.美团等.下面,结合我本人的开发经验,简单谈一 ...
- mysql复习(2)
一.数据定义: SQL数据的定义包括模式的定义.表定义.视图定义和索引的定义. 1.基本的模式定义情况如下表. 2.一个关系数据库管理系统的实例中可以创建多个数据库,一个数据库中可以建立多个模式,一个 ...
- 第十二篇 JavaScript(简称JS) 实现显示与隐藏
JavaScript JavaScript简称JS.JS是脚本语言,它是一种轻量级的编程语言,是可以插入HTML页面的编程代码,几乎所有现代浏览器都是支持的. 理论老师不行,我就抄袭手册上的一些关 ...
- Linux学习篇之OpenKM的安装(汉化)
OpenKM是一个开放源代码的电子文档管理系统,它的特点是可用于大型公司或是中小企业, 适应性比较强. 并且在知识管理方面的加工,提供了更加灵活和成本较低的替代应用,下面讲一下搭建方法. 一.以下都是 ...
- 使用 SignalR 实现推送功能
百度搜索:使用 SignalR 实现推送功能
- 《编译原理》求 FIRSTVT 集和 LASTVT 集的步骤 - 例题解析
<编译原理>求 FIRSTVT 集和 LASTVT 集的步骤 - 例题解析 算符优先关系表的构造中涉及到求 FIRSTVT 集和 LASTVT 集. 表示及含义: FIRSTVT(T) 非 ...
- local_time
time_t time(time_t *tloc); 功能:获取纪元1970-01-01 00:00:00以来所经历的秒数 参数: tloc:用来存储返回时间 返回值:成功:返回秒数, 失败:-1 - ...
- DevExpress ASP.NET Core v19.1版本亮点:Pivot Grid控件等
行业领先的.NET界面控件DevExpress 发布了v19.1版本,本文将以系列文章的方式为大家介绍DevExpress ASP.NET Core Controls v19.1中新增的一些控件及增强 ...
- django前戏
Django前戏: 1.软件开发: C/S 客户端与服务端 HTTP(超文本传输协议):协议的由来,如同sql语句由来一样.为了开发使用方便所形成的统一接口统一规范 学习Django之前我们先来了解下 ...
- base64 转 Image
/// <summary> /// base64 转 Image /// </summary> /// <param name="base64"> ...