对前面我的博客关于构造函数的补充以及对象的赋值与复制和对自己学习的总结与思考

前面是对于构造函数的重新复习,自己找到了自己以前所写的笔记,又重新回顾了很多内容,今天就对之前博客关于构造函数的内容进行一些补充和深入,以及对于后续复制构造函数以及对象赋值的概念做一些了解,还有后续关于深复制和浅复制的问题探讨,我自己所学的所有c++知识,相关理论,都是自己看书,自己敲代码,自己去想,去验证,自己实践出来的,很希望大佬们来进行各种批阅和改正,这样大家都可以互相提高,关于我的代码笔记已经在我的上传资源里面了,如果你是初学者,如果你相信我,你自己可以去看,去下载(我自己设置的积分很低的吗,它自己变高了),这些基本上的理论实践代码都是在vs2015进行编译实验的,我自己亲自一点一点去敲代码的,最后调试成功,才贴上去的,大家可以放心,我做博客的初衷是为了蹭积分的,后来逐渐变成了对于我自身的督促,说实话,自己把它作为了一种乐趣,我的所有成功都通过博客来见证我的一步步成长,我很欣喜,对了csdn我也很感激,但是我不否认,很多博客都是互相抄的,可能你在网上找了十几篇博文,最后成功的也许只有一两篇,或者正是因为门槛过低,有些人的理解有问题,在上面贴出自己的思想和见解,很容易误导别人,我在这里也没有嘲讽csdn,但我真的热烈推荐,你可以多参考一些其他来源的博文,比如博客园,比如github,等等,来让自身不断优秀。

构造函数的作用:

就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定状态,构造函数的函数名与类名相同,而且没有返回值,构造函数通常被声明为公有函数,只要类中有了构造函数,编译器就会在建立新对象的地方自动插入对构造函数调用的代码,因此我们常说构造函数在对象被创建的时候将被自动调用。

默认构造函数:

调用时无需提供参数的构造函数被称为默认构造函数,如果类中没有写构造函数,编译器会自动生成,一个隐含的默认构造函数,该构造函数的参数列表和函数体都为空,如果类中声明了构造函数,(无论是否有参数),编译器便不会再为之生成隐含的构造函数。

  • 构造函数不需用户调用,也不能用户调用。
  • 构造函数是在定义对象时由系统自动执行的,而且只能执行一次,(构造函数在声明的时候若赋初值,则在定义的时候就不能赋初值了。)使用默认参数的构造函数:(一个类只能有一个默认构造函数,也就是说,可以不使用参数而调用的构造函数,一个类只能有一个)

         应该在什么地方指定构造函数的默认参数?

默认构造函数是指在声明构造函数的时候指定默认参数

                  在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值,因为类定义文件是放在头文件中的,它是类的对外接口,用户是可以看到的,函数的定义是类的实现细节,用户往往时看不到的,在声明构造函数时指定默认值,使用户知道在建立对象时怎么样使用默认参数。

如果构造函数的全部参数都指定了默认值,则在定义对象时可以给一个或者几个实参也可以不给出实参。在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数

对象的赋值:

如果一个类定义了两个或者多个对象,则这些同类之间的对象可以互相赋值,一个对象的值可以赋给另一个同类的对象。这里所指的对象是指对象中所有数据成员的值。

#include<iostream>
using namespace std;
class Box
{
public:
	Box(int = 10, int = 10, int = 10);
	int volume();
private:
	int height;
	int width;
	int length;
};
Box::Box(int h, int  w, int len)
{
	height = h;
	width = w;
	length = len;
}
int Box::volume()
{
	return (height*width*length);
}
int main()
{
	Box box1(25, 10, 4), box2;
	cout << "The volume of Box is" << box1.volume() <<endl;
	box2 = box1;
	cout << "The volume of Box is" << box1.volume() << endl;
	return 0;
}

我们也可以理解成 用一个已经初始化的对象去初始化另一个未初始化的对象。

对象的复制:

有时需要用到完全同样的对象,或者将某一时刻的对象保存下来,在现实生活中我们需要用克隆的办法。而c++就提供了这种机制,对象的复制机制,用一个已有的对象去复制出完全多个完全相同的对象。
一般形式为:类名  对象2 (对象1);用对象1复制出对象2
这时,在建立对象的时候会调用一个特殊的构造函数---复制构造函数,它具有一般构造函数的所有特性,其形参是本类对象的引用,其作用是使用一个已经存在的对象(由复制构造函数指定)去初始化同类的一个新对象。
用户可以根据实际问题的需要定义特定的复制构造函数,以实现同类对象之间数据成员的传递,如果程序员没有定义类的复制构造函数,系统就会在必要时自动生成一个隐含的复制构造函数,这个隐含的复制构造函数的功能是,把初始值对象的每个数据成员都i复制到新建立的对象中,因此,也可以说是完成了对象的复制。|

调用复制构造函数:三种情况

1:当用类的一个对象去初始化另一个对象的时候
2:如果函数的形参是类的对象,调用函数时进行形参和实参结合
3:如果返回值是类的对象,函数执行完成返回调用时


#include<iostream>
using namespace std;
class Time
{
private:
    int hour;
    int minute;
    int second;
public:
    Time()
    {
        cout << "没有参数的构造函数\n" << endl;
        hour = 0;
        minute = 0;
        second = 0;
    }
    Time(int h, int m, int s)
        :hour(h), minute(m), second(s)
    {
        cout << "带有三个参数的构造函数\n";
    }
    void SetTime(int h,int m,int s)
    {
        hour = h;
        minute = h;
        second = s;
    }
    void Show()
    {
        cout << hour << ":" << minute << ":" << second << endl;
    }
    Time(const Time& u)
    {
        hour = u.hour;
        minute = u.minute;
        second = u.second;
        cout << "大家好,我是复制构造函数\n";
    }    
};
void GetShow(Time p)
 {
   p.Show();
 }
Time temp()
{
    Time p(16,52,03);
    cout<<"我是复制构造函数调用的第三种情况"<<endl;
    return p;
}
int main()
{
//第一种情况调用复制构造函数
    Time t(18,25,42);
    Time t1= t;//触发了复制构造函数
    t1.Show();
    Time t2;//没有触发复制构造函数吗,只是简单的对象赋值
    t2 = t;
    t2.Show();
//第二种情况调用复制构造函数
    GetShow(t);
//第三种情况调用复制构造函数
    Time p2 = temp();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值