C++类和对象

类 class/struct

通常由一个或多个成员函数组成,这些成员哈数操作属于该类的某个特定对象的属性。在类的定义中属性表示为变量。这样的变量称为数据成员,声明在类的定义之内,但是在所有类的成员函数的定义体之外。

可以说类是数据(成员变量)+程序(成员函数)的封装。

一、成员访问说明符 public、private、protected

1. public 可以从类外部直接访问,protected/private不能从类外部直接访问
2. class如果没有定义限定符,默认访问权限private;struct默认public(因为要兼容C)
3. 每个限定符在类体中可以使用多次,作用域是从该限定符出现开始到下一个限定符之前或类体结束前
4. 类的访问限定符体现了面向对象的封装性。
5. 根据经验,数据成员应该声明为私有的,成员函数声明为公有的
6. private声明数据成员被视为数据隐藏,只能由对象的类的成员函数(和友元)访问。

二、this指针

我们可以看到对象的成员函数可以操作对象的数据,成员函数是如何知道哪个对象的数据成员要被操作的呢?

  • 因为每个对象都可以使用一个称为this的指针来访问自己的地址,this指针不是对象本身的一部分,也就是this指针占用的内存大小不会反应在堆对象进行sizeof操作运算得到的结果中。this作为一个隐式的参数被编译器传递给对象的每个非static成员函数。
  • this指针的类型:
    • 取决于对象的类型及使用this的成员函数是否被声明为const
    • 在Date类的非const成员函数中,this的类型是Date* const
    • 在Date类的const成员函数中,this的类型是const Date* const
  • 传递方式:通过ecx寄存器传递(参数个数确定,调用约定_thiscall);不定参数成员函数,参数压栈方式传递(_cdecl)

每个类中都有自己的六个默认成员函数,分别是:构造函数、拷贝构造函数、析构函数、赋值操作符重载、取地址操作符重载、const修饰的取地址操作符重载

三、构造函数

构造函数是一种特殊的成员函数,定义时必须和类同名,这样编译器才能把它和类的其他成员函数区分开。
构造函数没有返回值,因此对它们不可以指定返回类型(void也不行)。
对于每个创建的对象,C++要求调用一次构造函数,这有助于保证在程序使用该对象前它被正确的初始化。构造函数隐式的发生在对象创建前。

对象初始化:
te(int year, int month, int day)
    : year(..), month(..), day(..)
{ };
//初始化列表

初始化列表:以冒号开始,接着是以一个逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号里的初始值或表达式。
作用:完成类中各个成员变量的初始化,在初始化列表中分配空间。
(此时不能用this,因为空间还没有分配)
注意:
1.每个成员在初始化列表中只能出现一次
2.初始化列表只用于初始化类的数据成员,并不指定顺序,成员在类中的定义顺序就是初始化顺序,所以最好按定义顺序来写初始化。
3.尽量避免用成员变量初始化成员。

四、析构函数

析构函数是另一种特殊的成员函数。当对象撤销时,类的析构函数会隐式调用。
注意:
1. 析构函数在类名加上~
2. 无参数无返回值(不能重载)
3. 一个类有且只有一个析构函数(未显示定义,系统会自动生成缺省的析构)
4. 对象生命周期结束,编译器自动调用析构
5. 防止内存泄漏

五、拷贝构造函数

创建对象时把一个对象的值给它。用同类对象去拷贝。
1. 只有单个形参,并且这个形参时对本类类型对象的引用(常用const修饰)
2. 是特殊的构造函数,满足构造函数的所有性质
3. 参数要用引用的原因:创建对象(值传递)时需要一个临时变量来传递,这就会无限的递归下去;传引用时创建的临时变量存 对象地址,一次调用就完成。
4. 没有显式定义系统会自动合成一个;如果自己要定义要把函数里面的拷贝写出来,不然拷贝无效

六、赋值运算符重载operator

1.定义:重载操作符是有特殊函数名的函数,关键字operator后接需要定义的操作符符号
2.操作符重载也是一个函数,有返回值和形参表。形参数目和操作符的操作数目相同 3.重载操作符必须有一个类类型或枚举类型的操作数
4.操作符也有一个默认形参this(第一个形参)
5.不能被重载的:sizeof . .* :: ?: 五个
6.前置++返回被增量的引用,后置++返回旧值
7.>> << 必须定义为类的友元函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值