c++类和对象

初识

 

c与c++区别

C语言面向过程,更为关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
成。

 

注:c++兼容C语言中   struct  ,但将之升级为了类。

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分(;
号不能省略。
 

访问限定符

用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

9be655dd929940d4a3e646c15746c3e3.png

特点

1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. 如果后面没有访问限定符,作用域就到 } 即类结束。
5. class的默认访问权限为private,struct为public(因为struct要兼容C)

d09887e021a04ae284298d024bba0bcb.png

属性

类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数

024707e421fc455fa92235f2057e414b.png

 


 

 

 

类的声明和定义分离

小知识:定义标志开空间

注意:定义可以是初始化,但初始化不一定是定义。例:

a67f6f4d090943529dad865d810f39ef.png

 

声明中包于.h文件中,而定义包含于.cpp 文件中 只是搜索时要注意:

17e8c0787b2249cf867d84f08c892587.png

类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。

 

类的实例化

用类类型创建对象的过程,称为类的实例化。

 

特点

1.类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没
有分配实际的内存空间来存储它。

2.一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量

3.类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图。

         

类和 struct 的区别

重点:唯一区别就是默认访问顺序不同

类的默认访问顺序:先private(私有),再public(公有)。

struct的默认访问顺序:先public(公有),再private(私有)。

 

 

类的储存方式和大小

储存

在类域中只保存成员变量成员函数存放在公共的代码段:
79de114b9a314a03904dd36d4c972da7.png

特别:成员函数储存于代码段

a523b85cd2784529bd135749b10cff78.png

 

大小

由类的储存方式可以知道,计算一个类的大小,实际上就是计算其成员变量的大小,其成员函数储存于代码段不会占用类的空间。

特别:当一个类没有成员变量时,只有成员函数或者什么都没有时。例:

3b07c334368845f4bc7f0ed91fa68d75.png

此时类的大小为1字节,起占位作用标识对象实例化时定义存在过。

 

(隐含的)this指针

含义:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

fa40fa918b134461b9369f4381142078.png

特点

1.形参和实参部分,不能显示写出来

2.函数内部可以使用 

020c0a90da624ef2904144317c8bb170.png

 

3.this指针类型:类  类型* const  指针的地址不能被改变(const在 * 之后修饰指针本身,地址不能被改变

 

4.4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传
递,不需要用户传递。(函数参数为 n+1 个)

 

this指针的位置

this指针是一个形参,在上。(有些编译器可能会用寄存器来传参)

 

this指针易错题

1.

// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:
void PrintA()
{
cout<<_a<<endl;
}
private:
int _a;
};
int main()
{
A* p = nullptr;
p->PrintA();
return 0;
}

 

该代码会运行崩溃。

原因:此处将this指针置空后传递进行解引用。

6fd48c854cec4f1fb50881c217bdc03c.png

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值