【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全部拆解,就可以使用通过 ...
随机推荐
- how tomcat works 札记(两)----------一个简单的servlet集装箱
app1 (看着眼前这章建议读者,看how tomcat works 札记(一个)----------一个简单的webserver http://blog.csdn.net/dlf123321/art ...
- 一个简单的Java死锁示例(转)
在实际编程中,要尽量避免出现死锁的情况,但是让你故意写一个死锁的程序时似乎也不太简单(有公司会出这样的面试题),以下是一个简单的死锁例子,程序说明都写着类的注释里了,有点罗嗦,但是应该也还是表述清楚了 ...
- 3.Swift翻译教程系列——Swift基础知识
英语PDF下载链接http://download.csdn.net/detail/tsingheng/7480427 Swift是用来开发iOS和OS X应用的新语言,可是很多地方用起来跟C或者OC是 ...
- AndroidUI组件之TabHost
package com.gc.tabhost; /** * @author Android将军 * * * * 1.TabHost是一种非常有用的组件,TabHost能够非常方便地在窗体上放置 * 多 ...
- git - 简明指南(转)
安装 下载 git OSX 版 下载 git Windows 版 下载 git Linux 版 创建新仓库 创建新文件夹,打开,然后执行 git init 以创建新的 git 仓库. 检出仓库 执行 ...
- (大数据工程师学习路径)第一步 Linux 基础入门----用户及文件权限管理
用户及文件权限管理 实验介绍 1.Linux 中创建.删除用户,及用户组等操作. 2.Linux 中的文件权限设置. 一.Linux 用户管理 Linux 是一个可以实现多用户登陆的操作系统,比如“李 ...
- JavaScript中五种常见运算符
一. in运算符 in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望它的右操作数是一个对象.如果右侧的对象拥有一个名为左操作数值的属性名,那么表达式返回true.例如: var point ...
- C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码)
原文:C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码) 自动填密码大家可能都不莫生,最有名的应该是 按键精灵 只要是一个可以输入的地方都可以能过按键精灵来完成输入.我今 ...
- cocos2d-x 3.0rc1 创建project
1.进入bin文件夹 2.打开CMD命令行窗口中输入命令,然后按Enter(-p 包名 -l 语言 -d 新project存储路径)
- hdu 2066 一个人的旅行 最短路径
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...