前面是对于构造函数的重新复习,自己找到了自己以前所写的笔记,又重新回顾了很多内容,今天就对之前博客关于构造函数的内容进行一些补充和深入,以及对于后续复制构造函数以及对象赋值的概念做一些了解,还有后续关于深复制和浅复制的问题探讨,我自己所学的所有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;
}