新手c++之类与对象笔记(上)

auto关键词  自动推导类型 c++11

应用于迭代器

格式:

这其中的typeid().name()使用查看变量的类型的

auto a = &x;这是错误的 正确是:auto * b = &x; 指定必须要指针

auto &c =x; 可以用于引用

在同一行定义多个变量 必须是相同类型的 且按照第一个类型推导的

auto 不能作为函数的参数 不能直接用来声明数组

auto可以用于遍历数组  c++范围for

for循环后的括号由冒号“ :”分为两部分:第一部分是范 围内用于迭代的变量,第二部分则表示被迭代的范围。

格式分为两种for(auto e : array)和for(auto &e:array)  (其中array代表的是要遍历的数组名)

这两种遍历不同的是  第二种使用引用取别名 因此第二种可以通过遍历过程修改该数组的值 而第一种是相当于将数组拷贝一份给e 因此e在遍历过程的中改变不会影响到array数组

也就是说想要在遍历过程中修改数组要通过引用  缺点:只能正序遍历不能倒序

在c++中NULL会默认变成数字0 而C语言中的NULL在c++中由nullptr代替nullptr是C++11作为新关键字引入  为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr

C语言是面向过程 c++是面向对象 

在C语言中与c++中相似的是结构体 c++兼容了结构体的用法 且升级了struct成为了类

1.在struct中只能定义成员变量 而类中不仅能定义成员变量 还能成员函数

2.名称也可以直接带边类型 不用在想C语言那样在在名称前面写struct 

类定义 class 类名

在类中同时新加入了访问限定符 1.public 公有 在类外可以直接使用 通常用来定义成员函数

2.protect 保护 

3.private 私有 2和3都时阿紫类外不能直接访问的 一般通过公有成员函数间接访问

不加访问限定符默认整个类中都是私有的 访问限定符的范围从限定符开始到下一个限定符或者花括号结束

面向对象的三大特性:封装、继承、多态

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来 和对象进行交互

这样对类进行封装可以更好的管理

类的作用域:

成员函数定义与声明分离 类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::

作用域操作符指明成员属于哪个类域。

类形成一个类域 (基本上只要是花括号括起来的都是域)

命名空间是对全局的一些变量名字的封锁封装

类域是有2个作用 : 1.定义自己的成员并变成自己的一部分

                                 2.对自己成员进行保护

我们在类中定义了成员变量和函数 但是在类中都是声明 都没有开空间 那么是在什么时候开空间呢?

在用类名取定义变量时 这是成员也会开空间 这叫做对象的实例化

类和对象 是1对多的关系 也就是一个类可以创建和多个相同类的对象

一个类的大小计算 

在一个类中由成员变量和成员函数 其中类的大小只和成员变量大小有关 成员函数是不会参与类的大小计算的  

那么为什么不计算函数大小呢?那是因为在类的实例化时 每个对象的成员变量都会开独自的空间 而成员函数是放在公共空间的 是不会在每个对象中都存放一个成员函数的(每个对象都放成员函数会造成浪费)这里的计算时的成员变量时所有的 不论是在公共的 还是私有的都会参与计算

那么空类的大小是多少呢? 是1不是0  为什么 ? 这一个字节是不存储有效空间的 是用来表识对象被定义出来了

结构体内存对齐规则

1. 第一个成员在与结构体偏移量为0的地址处。

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。

VS中默认的对齐数为8

3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

结构怎么对齐 ? 为什么对齐?

在图中一共有两个成员变量 第一个_ch大小是1且从0开始放置 而第二个_i大小是4 且与vs系统默认对齐值8比较是较小值是4 所以需要从4开始放置_i形成了左边第一个图

而第二个图是不进行对齐直接进行放置

想要形成右边的图需要进行修改默认对齐值 

通过#pragma pack(1)将其改为1

通过修改默认对齐值可以使其不对齐

那么为什么要对齐

有数据总线的概念 一共32个数据总线点位 8个位1字节 一共有4个字节 也就是一次读4个字节 从整数位去读取 这样访问谁 都是从整数位开始 

而如果不对齐 可能会进行多次访问 在上图中右边的不对齐中 第一次读取4个字节 会读到_ch和_i的三个字节 之后还要在读取_i的剩下的一个字节空间和三个空白空间 这样就造成不必要的浪费 而且读取下来 还要进行裁剪和拼接才能读取到正确的内容

this指针

Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函 数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?

C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏 的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”

的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编 译器自动完成。

this指针特性

1. this指针的类型:类型* const,即成员函数中,不能给this指针赋值。

2. 只能在“成员函数”的内部使用

3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给

this形参。所以对象中不存储this指针。

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

const修饰的是this this 不能修改 而this指向的内容是可以修改的

this是不能修改的

选正常运行 this指针为空指针 但是在print函数中并没有用到this指针 所以不会报错

选运行崩溃 这里this指针为空 且在函数中使用了this指针 所以报错

this指针是形参 形参是存放在栈中的 也有些编译器如VS存放在ecx寄存器 

在c++中编译器会默认做很多事情

编译错误是说语法规则上有问题 运行错误是在找相关对象和定义找不到时的问题 

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值