@[TOC](初识C++(auto) + 类和对象上)
一.初始C++
1.auto关键字:(C++11)
1.作为一个变量的类型给这个类型初始化,auto自动识别初始化这个变量值的类型,为auto类型的这个变量开辟一个合适的空间。
补充:
1.typeid(变量名).name—>可以打印对应变量的类型:
2.auto声明的变量必须由编译器在编译时期推导而得。
3.对于一个auto的变量必须对他进行初始化
4.auto相当于一个站位符在编译的时候会进行类型的替换
5.auto不能声明一个数组;
6.auto是单行识别:建议一行不要初始化多个变量
2.可不可以作为函数参数呢?
auto自动识别不可以作为函数的参数:
3.auto具体比较好用在哪里呢?
可以进行复杂类型的自动识别不需要自己写复杂类型的声明:
4.可不可以作为函数返回值呢?
可以作为函数返回值:不建议作为函数返回值因为对于一个函数如果重复调用多个函数进行嵌套那么auto的类型返回值会把真正的函数类型藏的非常的深不利于他人对于代码的阅读!
5.auto作为指针类型和引用类型的区别:
1.声明指针类型:auto 或者 auto* 是具有同样的作用的:
2.auto声明引用类型必须要加上一个&,自己不去加上一个引用怎么知道这是一个引用!
2.基于范围的for循环(C++11)
1.范围for是C++11中引入的一个对于一个数组进行遍历的比较方便的方法:
2.自动的从数组中从头到尾的进行迭代每次++1下标。
3.把数组中的值初始化给e并且进行自动识别。
4.请注意:对于遍历的这个数组必须有一定的范围。
5.for循环迭代的范围必须是确定的
5-1. 对于数组来说就必须满足数组的大小是确定的:
5-2:对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。
1.如果进行引用的auto类型可以在遍历数组的过程中通过e是别名的这个方式进行对于数组中值的修改:
3.nullptr空值:(C++11)
1.在C++98中说对于一个变量我们要去初始化它的初始值!
我们观察一下C++库(stedef.h)中对于NULL的定义:
1.通过我们的观察会发现有两个值一个是数值0
2.一个是一个空的指针类型:
使用空值的指针时面对的问题!
1.处理:
程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。
在C++98中,==字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,==但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。
2.nullptr
- 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
- 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
- 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
4.相当于既然NULL对于表示指针空值有这样一个问题我们就再定义一个nullptr用来专门表示指针空值。
二.类和对象上
1.面向对象和面向过程
1.C语言是面向过程的,对于一个问题我们想要去解决这个问题就要从头走到尾。
2.通过逻辑判断和功能函数的调用从头到尾解决这个问题。
1.C++是面向对象的,我们需要解决一个问题把这个问题分开成不同的对象,通过对象之间的互联去解决问题。
2.类的引入:
1.struct 的优化:
1.我们C语言的结构体只能声明不同类型的变量,我们通过C语言去实现一个栈这样的一个数据结构,我们需要把栈这个数据结构的功能函数和结构体进行分离
2.在C++中支持结构体里面可以声明成员变量和(声明或者定义成员函数)。
类的两种定义方式:
- 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理
2.部分函数定义放在类中作为函数类型的定义,主要把定义和声明分离。只在类中声明,在另一个cpp文件中去定义:
2.C++ 的class
1.相比struct — class更加的安全:
1-2:class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
1-1: struct 定义的类是默认是开放的,在全局(成员变量和成员函数的定义声明)都可以找的到。
1-2: class 定义的类是默认是私有的,在全局(成员变量和成员函数的定义声明)都找不到的。
3.处理 公共 :私有 :保护
1.public 公共
2.private 私有的
3.protected 保护 : 保护和私有现在是相同作用:
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- 如果后面没有访问限定符,作用域就到 } 即类结束。
- class的默认访问权限为private,struct为public(因为struct要兼容C)
4.struct 和class区别:
1.struct 在C语言中是定义结构体的,结构体中只能定义类型变量。而且结构体类型在实例化的时候如果没有typedef就还有struct 这个东西,在C++中struct作为类去定义和class的区别是前面的默认公共 后面默认是私有 。(类具有的共性是可以声明和定义 成员函数)在c++中struct有C语言中的所有功能。
5.类的作用域:
1.类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。
2.关于push这个成员函数我们没有在类中去定义和声明我们在外面去声明这个成员函数我们需要使用::域访问限定符:同时因为函数定义比较长为了方便管理我们使用声明和定义分离的方式:
6.类的实例化:
1.我们举一个例子,类的定义相当于一个房子的图纸。
2.实例化相当于通过这个图纸造出一个实实在在的房子。
3.房子中住的人相当于成员变量。
4.一个图纸可以造多个房子,相同户型的房子住不同的成员变量:
5.实例化出的对象 占用实际的物理空间,存储类成员变量.
进行名称的修改一般我们会把成员变量名称前加上一个_
1.每个对象:成员变量进行实例化都会使用一块内存空间,但是公共的方法只有一份并且不会存在实例化的对象中有固定的一个空间存放公共函数。
2.每一个对象的大小就是成员变量的大小在实例化申请内存空间。
3.如何计算内存空间?
1.使用之前在C语言结构体的时候讲的内存对齐的概念:
总结:结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。
7.this指针:
我们观察一下下面的代码:
1.我们思考一下为什么d1这个对象调用print方法(函数),不需要传参数就可以直接把对应的年月日打印出来?
2.这里是有一个隐藏的对象指针去进行对象的成员变量的访问打印相当于下面的图片:
4.总结:
- this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
- 只能在“成员函数”的内部使用
- this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
- this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。