C++
基础部分
关于C++头文件:
一般不加.h,如果是自己定义的头文件则需要加.h;C语言加.h;在C++中使用C语言的头文件一般前面加C 例如:Cmath
C面向过程:
自顶向下,逐层细化。
多态:
一个接口,多种方法。在程序运行时才能决定调用的函数。
动态多态:运行时确定函数地址
静态多态:函数重载,运算符重载。编译期间多态。
命名空间解决命名冲突:
namespace A{
int a=10; // 命名空间只能在全局范围内定义。
}
用法:A::a
-
命名空间的嵌套:都是属于全局变量的。
A::B::a
C/C++结构体区别:
c++结构体①可以有成员函数②使用时不需要加 struct 关键字; C语言反之
C++含有bool类型:
C++中true为整数1,false为0;bool类型占据1字节大小,即1Byte=8bit;
C89没有bool类型,
const在C/C++的区别:
const修饰的局部变量在C语言中意为一个只读的变量,但是可以通过指针间接的修改它的值。全局变量不可以!
在c++中:(可修改但:)
1、对于基础数据类型,也就是const int a=10;编译器会把它放在符号表中,不分配内存,当对其取地址时,会分配内存。在使用时,如果用的是指针则取内存中的数值,如果用的是变量名则取符号表中的数值。两者值不同。
2、如果以变量的形式初始化const修饰的变量,系统欧冠会为其开辟空间
int b=10;
const int a =b; //系统会给a开辟内存。不会把a放入符号表中
3、const 自定义数据类型(结构体,对象)系统会分配空间。
const修饰的全局变量默认是内部链接,(只在当前源文件内有效 不能直接作用与别的源文件中) 如果 想要用在其他源文件中需要添加extern将其转换成外部链接。
引用:(起别名)
int num =10;
int &a=num; //①引用必须初始化②引用一旦初始化就不能再次修改别名。
- ①引用必须初始化
- ②引用一旦初始化就不能再次修改别名。
主要应用于作为函数的参数
数组的引用1:
int arr[5]={1,2,3,4,5};
int (&my_arr)[5]=arr;//加()是考虑中括号优先级问题
数组的引用2:用typedef 给数组类型取别名
typedef int TYPE_ARR[5];
int arr[5]={1,2,3,4,5};
TYPE_ARR &myArr =arr; //myArr就是arr的别名。
TYPR_ARR 就是一个数组类型(有5个元素 每个元素位 int)
·引用作为函数的返回值类型
- 不要返回局部变量的引用: 因为局部变量在栈区,生命周期短。
- 函数的调用可以作为左值 :加static解决上面的问题。
·引用的本质是一个常量指针:
int *const ref =&a;
·常量引用
常量引用主要用来修饰形参,防止误操作。
在函数形参列表中,可以加const修饰形参,防止形参改变实参。
常量指针和指针常量:
1、常量指针:指针的指向可以修改,指向的值不可以修改。
2、指针常量:
int a=10;
int b =20;
const int *p1 = &a; //常量指针:指针的指向可以修改
改: p1 = &b;
int *const p2 = &b; //指针常量:指针指向的值可以修改
改: *p2 = 10;
重载:
同一个作用域内,函数名相同,参数列表不同。
–常引用参数重载–
void func(int &a)
void func(const int &a) 常引用做重载条件
类
class和struct的区别:默认访问权限不同:class-private;struct-public
构造-析构-拷贝构造
拷贝构造:(拷贝构造函数不能初始化匿名对象)
Student(const Student &s);
拷贝构造三种调用时机:
1、使用一个已经创建完毕的对象来初始化一个新对象。
2、值传递方式给参数传值。
3、值方式返回局部对象。
深拷贝和浅拷贝:
浅拷贝:增加了一个指针指向已存在的内存地址。
深拷贝:自己在堆区new了一块内存,并生成一个指针指向这块内存。
~Person()
{
if(heght != NULL) //手动释放堆区内存。
{
delete m_Height;
m_Height =NULL; //指向空,防止野指针。
}
}