类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数
一.构造函数
1.构造函数的定义:
构造函数 是一个 特殊的成员函数,名字与类名相同 , 创建类类型对象时由编译器自动调用 ,保证每个数据成员都有 一个合适的初始值,并且 在对象的生命周期内只调用一次 。 其实构造函数的作用就是完成成员变量的初始化 ,但不同于c语言的初始化构造函数可以实在创造对象的同时就完成成员变量的初始化。
2.构造函数的特征:
1. 函数名与类名相同。
2. 无返回值。
3. 对象实例化时编译器 自动调用 对应的构造函数。
4. 构造函数可以重载。
3.构造函数的实现:
构造函数的实现主要有三种,
1.当用户没有实现构造函数的话系统会默认创造一个,此时系统会将内置类型的成员变量赋予随机值,而对于自定义类型的成员变量则会调用他们的构造函数。(注:内置类型一般指的是:int char double float等这些定义好的类型,自定义类型指的是:struct这种类型以及class类这种)。
2.当然用户也可以自己实现构造函数,一种为无参构造
3.类一种为带参构造,但是在带参构造中我们使用全缺省构造。我们用代码展示一下:
3.1.系统默认的构造函数
我们可以看到当我们没有在Data类进行函数构造的时系统将会自己默认创建构造函数,对内置类型变量赋予随机值,自定义类型调用自己的构造函数(若自定义类型也没有定义构造函数那么此例子中的_a1和_a2也会被赋予随机值)
3.2无参构造
3.3 带参构造
这里出一个问题对于代码风格造成的问题:成员变量year最后的结果是多少呢?
class A{public:A(int year){year = year;}private:int year;};int main(){A a(20);}
答案是:随机值。那么为什么是随机值呢?这里主要是变量之间它采用了就近原则,所以等式左边的year会直接寻找离他最近的变量所以会将等式右边的year直接赋值给它自己,所以year最后的值就是随机值。
我们继续来说带参的构造函数,我们一般推荐使用的是全缺省的构造函数(注:
无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,三者都可以认为是默认成员函数。
)
二 析构函数
构造函数时完成对象的初始化,那么一个对象又是怎么样被销毁的呢?
1.析构函数的定义
与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而 对象在销毁时会自动调用析构函数,完成类的一些清理工作。
2.析构函数的特征
1. 析构函数名是在类名前加上字符 ~ 。
2. 无参数无返回值。
3. 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数 。
4. 对象生命周期结束时, C++ 编译系统系统自动调用析构函数。
这里我们用栈的例子来说明析构函数的实现以及作用。
class Stack
{
public:
Stack(int capacity = 4)
{
_a = (int*)malloc(sizeof(int)*capacity);
if (_a == nullptr)
{
cout << "malloc fail" << endl;
exit(-1);
}
_top = 0;
_capacity = capacity;
}
//析构函数的实现
~Stack()
{
// 像Stack这样的类,对象中的资源需要清理工作,就用析构函数
free(_a);
_a = nullptr;
_top = _capacity = 0;
}
private:
int* _a;
int _top;
int _capacity;
};
这里是完成构造函数,有自己定义的析构函数的效果。同构造函数一样对于内置成员变量析构函数会置为随机值,而自定义类型则会去调用他们的析构函数。
三 拷贝函数
如果某些时候我们需要去复制一个对象,这样的话我们该怎么样去解决呢?
这里我们就需要引入拷贝函数。那么什么叫做拷贝函数呢?我们应该去怎么实现呢?有什么注意事项呢?这里我们一一来说道。
1.拷贝函数定义
构造函数 : 只有单个形参 ,该形参是对本 类类型对象的引用 ( 一般常用 const 修饰 ) ,在用 已存在的类类型对象 创建新对象时由编译器自动调用 。
2.拷贝函数的特性
1. 拷贝构造函数 是构造函数的一个重载形式 。
2. 拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用 。
3. 若未显示定义,系统生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷 贝,这种拷贝我们叫做浅拷贝,或者值拷贝。
3.拷贝函数的实现
拷贝函数的实现分为两种一种是系统默认,一种是自己定义。我们分别来看其效果
class A
{
public:
A()
{
_a1 = 1;
_a2 = 2;
}
~A()
{
cout << "A()" << endl;
}
private:
int _a1;
int _a2;
};
class Data
{
public:
/*Data()
{
_year = 2021;
_month = 12;
_day = 12;
}*/
//Data(int year, int month, int day)
//{
// _year = year;
// _month = month;
// _day = day;
/
本文标题为:详解C++之类和对象(2)


基础教程推荐
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26
- C语言 structural body结构体详解用法 2022-12-06
- 一文带你了解C++中的字符替换方法 2023-07-20
- C/C++编程中const的使用详解 2023-03-26
- 如何C++使用模板特化功能 2023-03-05
- 详解c# Emit技术 2023-03-25
- C++详细实现完整图书管理功能 2023-04-04
- C利用语言实现数据结构之队列 2022-11-22
- C++中的atoi 函数简介 2023-01-05
- C语言基础全局变量与局部变量教程详解 2022-12-31