首页 / C++ / C++ 类和对象(中)
C++ 类和对象(中)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++ 类和对象(中),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4162字,纯文字阅读大概需要6分钟。
内容图文
![C++ 类和对象(中)](/upload/InfoBanner/zyjiaocheng/606/e49f3e1d8d5b4785be92fd4e34540679.jpg)
目录
1.类的默认六个成员函数
- 构造函数
- 析构函数
- 拷贝构造
- 赋值运算符重载
- 取地址运算符重载
- const修饰的取地址运算符重载
2.构造函数
2.1构造函数的定义
(1)构造函数可以被重载。
- 可以为一个类声明的构造函数的数量没有限制,只要每个构造函数的形参表是唯一的。
(2)实参决定使用哪个构造函数。
(3)构造函数自动执行。
- 只要创建该类型的一个对象,编译器就运行一个构造函数。
(4)构造函数不能声明为const。
2.2构造函数的特性
(1)函数名与类名相同
(2)无返回值
(3)对象实例化时编译器自动调用对应的构造函数
(4)构造函数可以重载
(5)如果用户没有自己定义构造函数,那么编译器会自动生成一个无参的默认构造,若用户定义了,则编译器不再自动生成。
(6)无参构造和全缺省的构造统称为“默认构造函数”,并且默认构造函数只能有一个。(无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。若无参的和全缺省的同时存在,要构造一个无参对象时会出错)
无参构造和全缺省构造构成函数重载,但是不可以同时存在。
2.3代码示例
#include<iostream>
using namespace std;
class Date
{
public:
Date()
{
_year = 1900;
_month = 1;
_day = 1;
}
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
void Test()
{
Date d1;
}
3.析构函数
3.1析构函数定义
析构函数是类的另一个特殊成员函数,它的作用与构造函数相反,C++规定析构函数的名字是类的前面加上一个波浪号(~):
~类名()
{
函数体}
- 析构函数不返回任何值,没有返回类型,也没有函数参数。由于没有函数参数,因此它不能被重载。换言之,一个类可以有多个构造函数,但是只能有一个析构函数。
3.2代码示例
typedef int DataType;
class SeqList
{
public :
SeqList (int capacity = 10)
{
_pData = (DataType*)malloc(capacity * sizeof(DataType));
assert(_pData);
_size = 0;
_capacity = capacity;
}
~SeqList()
{
if (_pData)
{
free(_pData ); // 释放堆上的空间
_pData = NULL; // 将指针置为空
_capacity = 0;
_size = 0;
}
}
private :
int* _pData ;
size_t _size;
size_t _capacity;
};
4.拷贝构造函数
4.1拷贝构造函数定义
拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:
- 通过使用另一个同类型的对象来初始化新创建的对象。
- 复制对象把它作为参数传递给函数。
- 复制对象,并从函数返回这个对象。
如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。
4.2拷贝构造函数特性
(1)拷贝构造只是构造函数的一个重载
(2)拷贝构造的参数只有一个,且必须引用传参,使用传值方式会引发无穷递归调用。
5.复制运算符重载
5.1复制运算符重载定义
- 当运算符作用域类类型对象时,可以通过运算符重载重新定义该运算符的含义,明智使用运算符重载能令我们的代码更易于编写和阅读。
- 重载的运算符是具有特殊名字的函数,它们的名字由关键字operator和其后要定义的运算符号共同组成,重载运算符函数的参数数量与该运算符的运算对象数量易于多,一元运算符有一个参数,二元运算符有两个参数,除了重载运算符operator()外,其它重载运算符不能有默认实参。
- 如果一个运算符函数是成员函数,则它的第一个运算对象绑定到隐式的this指针上,因为成员运算符函数的显式参数数量比运算符的运算对象少一个。
- 运算符函数至少含有一个类类型的参数,不能重定义内置类型的运算符
5.2哪些运算符可以重载
大部分运算符都能被重载.
有些运算符则不行,例如::,.*,.,? :
5.3代码示例
class Person
{
public:
int height = 180;
};
std::ostream& operator<<(std::ostream& os, const Person& person)
{
os << "person.height=" << person.height;
return os;
}
std::istream& operator>>(std::istream& is, Person& person)
{
is >> person.height;
if (!is) {
person.height = 0;
}
return is;
}
6. const修饰的取地址运算符重载
6.1const修饰的取地址运算符重载定义
const修饰的类成员函数称为const成员函数,实际修饰的是该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
- 格式为 void menberFun() const
因为this指针是隐含的,我们无法在this指针前添加const,所以我们只能在函数后面加const
6.2代码示例
class A
{
public:
void setA(int a) //this : A* const 指向不能改变
{
_a = a;
}
int getA() const // this : const A* const 指向和内容都不能改变
{
_a = 10;
return _a;
}
private:
int _a;
};
内容总结
以上是互联网集市为您收集整理的C++ 类和对象(中)全部内容,希望文章能够帮你解决C++ 类和对象(中)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。