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)机制允许一个类将 ...
随机推荐
- O006、CPU和内存虚拟化原理
参考https://www.cnblogs.com/CloudMan6/p/5263981.html 前面我们成功的把KVM跑起来了,有了些感性认识,这个对于初学者非常重要.不过还不够,我们多少要 ...
- centos安装配置LAMP,https,fastcgi
Centos7 配置LAMP+fastcgi(Centos7.2+php7.0+mariadb+httpd) 环境:阿里云centos7.3 一.安装并配置数据库 1.安装数据库 #yum ins ...
- VUE 从零开始 学习笔记 一
最近刚跳到一个新公司 不是很忙 决定系统的学习一下VUE这个前端框架 参考官方API 好了 废话不多说 开始了 首先 说一下吧 现在很火的主流三大前端框架 Vue,Angular.React, 为什么 ...
- Linux中的grep 命令
介绍grep文本处理命令,它也可以解释正则. 常用选项: -E :开启扩展(Extend)的正则表达式. -i :忽略大小写(ignore case). -v :反过来(invert),只打印没有匹配 ...
- Java中的字符串常量池,栈和堆的概念
问题:String str = new String(“abc”),“abc”在内存中是怎么分配的? 答案是:堆内存.(Tips:jdk1.8 已经将字符串常量池放在堆内存区) 题目考查的为Ja ...
- Java程序员常用的Linux命令01——linux命令基础
1.显示日期的命令date 显示日期: [root@localhost ~]# date 显示年月日: [root@localhost ~]# date '+%Y%m%d' 2.显示日历指令cal 显 ...
- Delphi Memo组件
- 如何避免学习linux必然会遇到的几个问题
相信在看这篇文章的都是对linux系统所迷的志同道合的人,不管你是刚开始学,还是已经接触过一些linux的知识,下面的问题是你在学习linux所必须遇到的,若是没有的话那我只能说大神我服你了.下面我就 ...
- stm32 development
1.www.st.com st官网 2.www.stmcu.com.cn st中文网 3.www.stmcu.org.cn st中文社区
- verilog 实用的小技巧
(之后还会持续的更新) 移位操作的实现: verilog有一种非常简单的移位操作实例如下: reg [3:0] source; reg out; {out,source[3:0]}={source[3 ...