C++基础知识
- 前言
- 基础
 
前言
当初为了赶一波互联网热潮自学了java,如今因为需要就从java转向C++开发,于是就有了java到C++入门,每次的学习我都会记录一下C++的学习历程。
基础
- C++对于内存的控制管理比java要有更多要求,因此C++对于变量的创建是需要思考的,变量存在的意义就是方便管理内存,而创建变量就是申请一块合适的内存空间。
- 如何给变量申请合适的内存空间,就需要定义需要的数据类型,C++数据类型所占的内存大小(字节)如下所示,而具体到用有符号数还是无符号数就看具体需求:
| 数据类型 | 占用内存空间(字节) | 
|---|---|
| 整型 | |
| short | 2 | 
| int | 4 | 
| long | 4 | 
| long long | 8 | 
| 浮点型 | |
| float | 4 | 
| double | 8 | 
| 字符型 | |
| char | 1 | 
| 布尔类型 | |
| bool | 1 | 
-  常数,用于记录程序中不可改变的数据,C++有两种定义方法: 
 1、#define 宏定义
 2、const 修饰词
-  数据输入输出: 
 1、cin>>变量 获取键盘输入
 2、cout<<数据 输出到控制台
-  C++中的条件和循环语句就和java几乎一样 
-  指针见C++灵魂->指针 
-  结构体:属于自定义数据类型,可以存储不同的数据类型 
语法:struct 结构体名称 {结构体成员列表};
- 内存四区(代码区、全局区、栈区、堆区):不同区域存放不同的数据,有不同的生命周期,便于灵活管理。
 程序运行前,编译后:
 1、代码区存放CPU执行的机器指令 ,有共享和只读特性。
 2、全局区存放全局变量、静态变量、字符串常量和const修饰的全局变量(全局常量)
 程序运行之后:
 1、栈区(编译器自动分配释放)存放局部变量和const修饰的局部变量(局部常量)
 (1)不要返回局部变量的地址
 (2)不要返回局部变量的引用
 2、堆区(程序员分配释放,否则程序结束后由系统释放)
 (1)由new关键字来将数据开辟到堆区新内存
 (2)由delete关键字将内存地址释放(释放数据时delete[ ])
- 引用:给变量其别名
例如:数据类型 &别名 = 原名;
-  函数参数传递方法: 
 1、值传递:每次传递都会复制数据,会耗用内存;形参不会改变实参。
 2、地址传递(指针),可以减少占用内存,但会可能会造成原数值的修改,可以在传入时加上const防止修改数据的误操作。
 3、引用传递,可以简化指针,和地址传递效果一样,同样可以在传入时加上const防止修改数据的误操作。
-  引用课程里的对于引用的本质讲解 
 引用的注意事项:1、引用必须初始化;2、引用不可更改
-  C++函数的形参可以默认值【注:当其中一个形参有默认值,则该形参的右侧参数都得有默认值;函数声明和实现中只能写一个】。 
-  C++函数的占位参数,就是形参中只有数据类型,也可以设置默认值。 
-  C++中struct和class的唯一区别就是struct的访问权限默认是公有的,class则为私有。 
-  对象的初始化及清理【即构造函数及构析函数】 
 1、当类对象被创建时,程序至少会自动创建三个构造函数【无参构造、有参构造及拷贝构造】。
 2、类对象作为类成员被创建时,先调用对象成员的构造再调用类成员的构造,构析函数则相反。
-  this指针:this指针指向被调用的成员函数所属的对象 
 1、解决名称冲突
 2、在类的非静态成员函数中返回对象本身,即return *this;
-  空指针可以访问成员函数 
-  常对象【声明对象前加const修饰符】只能调用常函数【成员函数后加const修饰符,常函数内不能修改成员属性】 
-  友元,即使函数或者类能访问另一个类的私有变量 
 1、全局函数做友元:在该类中声明全局函数,并且在前面加上friend
 2、类做友元:在该类中声明要访问的类,并且在前面加上friend
 3、成员函数做友元:在该类中声明成员函数,并且在前面加上friend
-  继承: 
 1、先调用父类构造函数再调用子类构造函数,构析函数则相反。
 2、子类调用父类中的同名成员(变量、函数),需要加作用域;调用子类本身中的时,正常调用。
 3、C++中允许多继承
-  字符数组可以初始化直接赋值,但是不能声明后再直接赋值,但可以用strcpy()函数,如: 
char str1[40] = "fjkahfhahkfhah";   //正确
/
char str2[40];
str2[40] = "aihfihncsajkhjk";  //错误
/
char str3[40];
strcpy(str3,"aihfihncsajkhjk");  //正确
