【c++类的构造函数具体解释 】
一、构造函数是干什么的
class Dog
{
public:
// 类Dog的构造函数
// 特点:以类名作为函数名,无返回类型
Dog()
{
weight = 0;
}
private:
// 数据成员
int weight;
}
该类对象被创建时,编译系统对象分配内存空间,并自己主动调用该构造函数->由构造函数完毕成员的初始化工作
int main()
{
Dogdd;
}
编译系统为对象dd的每一个数据成员(weight)分配内存空间,并调用构造函数Dog( )自己主动地初始化对象dd的weight值设置为0
故:
构造函数的作用:初始化对象的数据成员。
二、 构造函数的种类
class Dog
{
private :
double height;
double width;
public:
// 无參数构造函数
// 假设创建一个类你没有写不论什么构造函数,则系统会自己主动生成默认的无參构造函数,函数为空,什么都不做
// 仅仅要你写了一个以下的某一种构造函数,系统就不会再自己主动生成这样一个默认的构造函数,假设希望有一个这种无參构造函数,则须要自己显示地写出来
Dog(void)
{
height= 0.0;
width=0.0;
}
// 一般构造函数(也称重载构造函数)
// 一般构造函数能够有各种參数形式,一个类能够有多个一般构造函数,前提是參数的个数或者类型不同(基于c++的重载函数原理)
// 比如:你还能够写一个 Dog( int num)的构造函数出来
// 创建对象时依据传入的參数不同调用不同的构造函数
Dog(double a, double b)
{
height= a;
width = b;
}
// 复制构造函数(也称为拷贝构造函数)
// 复制构造函数參数为类对象本身的引用,用于依据一个已存在的对象复制出一个新的该类的对象,一般在函数中会将已存在对象的数据成员的值复制一份到新创建的对象中
// 若没有显示的写复制构造函数,则系统会默认创建一个复制构造函数,但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险,详细原因请查询 有关 “浅拷贝” 、“深拷贝”的文章论述
Dog(const Dog & c)
{
//将对象c中的数据成员值复制过来
height = c.heightl;
width = c.width;
}
// 类型转换构造函数,依据一个指定的类型的对象创建一个本类的对象
// 比如:以下将依据一个double类型的对象创建了一个Dog对象
Dog::Dog(double r)
{
height = r;
width = 0.0;
}
// 等号运算符重载
// 注意,这个类似复制构造函数,将=右边的本类对象的值复制给等号左边的对象,它不属于构造函数,等号左右两边的对象必须已经被创建
// 若没有显示的写=运算符重载,则系统也会创建一个默认的=运算符重载,仅仅做一些主要的拷贝工作
Dog &operator=( const Dog&rhs )
{
//首先检測等号右边的是否就是左边的对象本,若是本对象本身,则直接返回
if ( this ==&rhs )
{
return *this;
}
//复制等号右边的成员到左边的对象中
this->height= rhs.height;
this->width= rhs.width;
//把等号左边的对象再次传出
//目的是为了支持连等 eg: a=b=c 系统首先执行 b=c
//然后执行 a= ( b=c的返回值,这里应该是复制c值后的b对象)
return *this;
}
};
以下使用上面定义的类对象来说明各个构造函数的使用方法:
void main()
{
// 调用了无參构造函数,数据成员初值被赋为0.0
Dog c1,c2;
// 调用一般构造函数,数据成员初值被赋为指定值
Dog c3(1.0,2.5);
// 也能够使用以下的形式
Dog c3 = Dog(1.0,2.5);
// 把c3的数据成员的值赋值给c1
// 因为c1已经事先被创建,故此处不会调用不论什么构造函数
// 仅仅会调用 = 号运算符重载函数
c1 = c3;
// 调用类型转换构造函数
// 系统首先调用类型转换构造函数,将5.2创建为一个本类的暂时对象,然后调用等号运算符重载,将该暂时对象赋值给c1
c2 = 5.2;
// 调用拷贝构造函数( 有以下两种调用方式)
Dog c5(c2);
Dog c4 = c2; // 注意和 = 运算符重载区分,这里等号左边的对象不是事先已经创建,故须要调用拷贝构造函数,參数为c2
}
【c++类的构造函数具体解释 】的更多相关文章
- C++继承具体解释之二——派生类成员函数具体解释(函数隐藏、构造函数与兼容覆盖规则)
在这一篇文章開始之前.我先解决一个问题. 在上一篇C++继承详解之中的一个--初探继承中,我提到了在派生类中能够定义一个与基类成员函数同名的函数,这样派生类中的函数就会覆盖掉基类的成员函数. 在谭浩强 ...
- [改善Java代码]使用匿名类的构造函数
建议39: 使用匿名类的构造函数 阅读如下代码,看看是否可以编译: public class Client { public static void main(String[] args) { Lis ...
- c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]
说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...
- scala中的面向对象定义类,构造函数,继承
我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- scala入门教程:scala中的面向对象定义类,构造函数,继承
我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面 ...
- [转]c++类的构造函数详解
c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初 ...
- C++-什么时候需要在类的构造函数中使用初始化列表
1,如果基类没有default构造函数,则意味着其不能自己初始化.如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数.下例中Base 2,如果类成员没有默认构造函数.下例中E ...
- tuple解包给类的构造函数
首先我们的第一步当然是将tuple解包.tuple提供了一个get函数来获取第N个元素.例如: get<1>(make_tuple(...)); 要将一个tuple全部拆解,就可以使用通过 ...
随机推荐
- hdu 5045 费用流
滚动建图,最大费用流(每次仅仅有就10个点的二分图).复杂度,m/n*(n^2)(n<=10),今年网络赛唯一网络流题,被队友状压DP秒了....难道网络流要逐渐退出历史舞台???.... #i ...
- 彩色图像--色彩空间 CMY(K)场地
得知DIP文章63日 转载请注明文章出处:http://blog.csdn.net/tonyshengtan .出于尊重文章作者的劳动,转载请标明出处!文章代码已托管.欢迎共同开发:https://g ...
- UVA 11584
Problem H: Partitioning by Palindromes We say a sequence of characters is a palindrome if it is the ...
- 关于cocos2dx导入安卓项目至eclipse的诸多问题
看视频实在是有点蛋疼,尽管我也想在苹果上做,可是奈何自己是一个小屌丝,根本买不起高富帅的装备.所以仅仅能硬着头皮去处理win以下的问题. 在把用C++语言编写的cocos2dx项目编译编译完毕之后,导 ...
- NFS文件系统配置 和 GLIBC更新
为了配置集群环境,把过程记录一下,方便后续使用 NFS 文件系统 是 network file system 配置好ssh无密码访问 ,各节点为centos6.5 主节点 在文件/etc/expor ...
- 在.NET Fiddle有趣的沙盒代码
在.NET Fiddle有趣的沙盒代码 笔者:Tony Patton | 托尼·巴顿译:PurpleEndurer,2014-11-18,第1版 C#和VB.NET开发者能够使用.NET Fiddle ...
- React组件开发入门
React 组件开发入门 Introduction 本文组成: Ryan Clark文章Getting started with React的翻译. 博主的实践心得. React由Facebook的程 ...
- ubuntu下安装myeclipse
一.下载myeclipse 官网下载:http://www.myeclipseide.com/ 我使用的是myeclipse pro 2014.run,重命名为myeclipse.run 示例路径:/ ...
- JavaEE(18) - JPA原生SQL查询和存储过程
1. 使用原生SQL执行查询 2. 映射原生SQL查询的结果集 3. 使用原生SQL查询执行实体查询 4. 命名原生SQL查询 5. 在JPQL查询中调用存储过程
- JAVA类型修饰符(public,protected,private,friendly)
JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...