面向对象(OOP)和类

1.面向对象
As is we all known C是面向过程的
然而它的进化版C++是面向对象的
面向对象是怎么搞的呢
事实上,面向对象其实很简单
它比较现实
比如一个人是由很多零件来组成的
对于面向过程的语言来说
关注的它的胳膊,它的腿,要完成一个动作,就要让胳膊干啥,腿干啥
然而对于面向对象来说,它习惯于直接面向这个人,所关注的这个人的啥,而至于底层怎么实现,并不关注
2.然后我们说类(class)
类其实和C语言中的结构体有点类似,但有不一样
类可以定义函数(事实上在C++中结构体struct 仍然可以定义函数)
所以在c++中要说类与结构体的不同那么说实在的
就只有一个地方
类定义的成员默认的访问权限是private(私有)
而结构体所定义的成员默认是public(公开)
其他的事实上没有什么不一样
接下来我们具体的讨论一下类的概念
首先类的定义方式
class{
private:
public:
protected;
}
private是私有的意思
public是公开的意思
protected是保护的意思
私有和保护所定义的成员只有类内才能访问
共有的所定义的东西是公开的,支持在类外进行访问
事实上,这种看起来很复杂的体制完美的体现了C++相较于C语言的安全性
它的内部成员不允许外部随意的修改
而只是给外部开了一个接口
比如说一个家庭的银行开是私有的家庭的隐私仍然是私有的
因此你不可以去访问他们
而大门是开的
这就意味着你可以通过这扇大门去访问人家想让你看到的东西
事实上,这一设计比C语言更符合显示体验
事实上上述说的这些东西体现了C++的第一个特点就是封装的思想
事实上它就是把你的数据(成员变量)和数据的操作(函数)再进行了一次包装
从而达到隐藏数据操作复杂过程的目的
3.类的作用域:
前面所学的namespace是一个域,它所定义的变量和函数只能在它的内部发挥作用
这里类的作用作用域事实上和这个思想稍有类似
事实上定义一个类就相当于创建了一个家庭
你要对它的成员进行操作就必须把成员从里边拿出来
因此相对类的成员进行操作就必须先通过::运算符把它拿出来
比如
class Date{
public:
void Printf();
private:
int _year;
int _month;
int _day;
}
你要在类外对Printf()进行操作就必须
void A::Printf()
{
cout<<_year<<month<<day<<endl;
}
4.类的实例化
其实在现实中任何东西都可以抽象成一个类
这就看你的脑洞有多大了_
5.类的大小
事实上类的大小计算和C语言中结构体大小计算有诸多相似之处
但是要记住一点
不要考虑类中定义函数的空间大小
事实上类也遵守内存对齐的基本规则
然而需要主要的是:
空类的大小是1
它代表了类的标识符
这里我再说一下内存对齐规则
1.第一个成员在于结构体便宜量为0的位置处
2.其他成员要对齐到某个数字(对齐数)的整数倍处
#pragma pack()
可以改变对齐数
3.整个结构题的大小:最大对齐数的(所有变量最大者和默认对齐数取最小)整数倍
4.如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数被,结构体的总大小就是所有最大对齐数的整数倍
6,this指针
首先我们说一下对象的概念
其实非常的easy就是类创建的自定义类型的变量而已
事实上,c++编译其会对每个非静态的的成员函数增加一个隐藏的指针参数,而且一定是第一个参数,让该指针指向当前对象(函数运行时调用函数的对象),在成员体中所有对其成员的访问,都可以通过这个指针来进行访问,而且这东西是透明的,就是你不需要取自己传,因为编译器已经帮你搞定了,以至于你可以不显示的写this 直接对当前对象的成员进行访问也行
需要主要的对象
1.this指针的类型是 (自定义类型)const 表示指向的东西只能是调用函数的对象
2.只能在成员函数的内部来使用
3.对象中并不存储this指针,它只是成员函数一个形式参数
4.this指针是编译器通过ecx寄存器自动传的,不需要程序员自己取传
这里还有一个话题就是this 指针能不能为空的话题
事实上它是可以为空的
事实上只要你不用类成员this 也就意味着你没有对this 指针进行解引用
来欣赏下面一段代码
class A{
public:
void Printf()
{
cout<<_year<<_month<<_day<<endl;
相当于
cout<_year<month<day<<endl;
}
void test()
{
cout<<"i love you C++ "<<endl;
}
private :
int _year;
int _month;
int _day;
}
int main(void)
{
A
p=nullptr;
p->test();//不会崩,因为并没有解引用操作
p->Printf();//势必崩
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值