C++学习
一、记简单语法
- C++标准库提供了一系列有用的功能和类,为了避免与用户自定义的类型或函数名冲突,标准库中的大多数内容都被放置在一个名为std的命名空间中。
- 单引号内部有且仅有只能提供一个字符,双引号内部提供字符的数量不限
- 符号常量(#define,结尾不需要分号)与常变量(const),前者的值在其作用域内是不能改变的,也不能被赋值,后者在定义常变量时必须同时对它初始化,此后它的值不能再改变。
- 区别:常变量与符号常量的区别:符号常量不占用内存空间,在预编译时就全部由符号常量的值替换了,而常变量占用内存空间,只是此变量在存在期间不能重新赋值。
- 预处理操作有#include(运行原理为直接复制原来的c++ text内容到本文件中),#if,#define
- static的不同含义
- 在修饰局部变量时,使得该变量不会因为函数终止而丢失,使其生命周期为整个源程序。
- 把全局变量改变为静态变量后限制了它的使用范围(仅在本域内使用)
- 可以将变量默认初始化为0
- 类中的static------静态成员函数和静态成员变量属于类,不属于类的实体,无论实例化多少个改变量函数只有一个。
- 静态成员函数只能访问静态成员变量和函数,不能访问其他变量;非静态函数可以访问非静态与静态函数与变量
- 静态成员变量必须在class外声明静态变量并初始化
- inline内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。内联函数通常就是将它在程序中的每个调用点上"内联地"展开。
- 枚举类型是一种派生数据类型,它是由用户定义的若干枚举常量的集合。默认值从0开始,枚举变量的值只能取枚举常量表中所列的值,就是整型数的一个子集。
- 枚举变量可以直接输出,但不能直接输入。
- 不能直接将常量赋给枚举变量。
- 类的构造函数类似于类初始化(只在实例化时自动执行),一个类内可以有多个构造函数(函数重构)。也可以使用成员初始化列表进行初始化(列表须按照变量声明的顺序初始化)
- 类的析构函数是构造函数的反面,当类被销毁是该方法会被触发
- 类的继承:基类可以被继承为 public、protected 或 private 几种类型
- 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问
- 保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员
- 私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员
- 类的虚函数virtual及override实现了C++多态(polymorphism),虚函数允许子类重新定义父类成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。
- 类的纯虚函数就是类的接口,这个接口必须在后面的继承中被实现
- 创建对象 new 和不 new 的区别
- 作用域不同。
- 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了,(安全不会造成内存系统泄漏)。
- 用new:创建的是指向类对象的指针,作用域变成了全局,当程序结束时,必须用delete删除,系统不会自动释放,(不注意可能造成内存泄漏)。
- 不用new的是一个类对象,用new的是一个是指向类对象的指针。
- mutable允许常量方法(不能是函数)可以修改变量
- 在C++中,如果在if块或for块中声明变量,它们的作用域仅限于该块内。一旦控制流离开了这个块,这些变量就会离开其作用域并被销毁。
- new在堆中生成变量并返回变量的指针(生存周期更长),需要delete手动删除
- 智能指针可以自动释放堆上面申请的变量,而不显性的使用delete操作符
- unique_ptr(作用域指针):当离开当前作用域,堆上变量将自动释放,且不能复制
- shared_ptr(共享指针):只用当所有的共享堆上变量的指针释放,该堆上变量才会释放。内涵引用计数(即引用当前堆上变量指针的个数)
- weak_ptr(虚指针):类似于shared_ptr,但不会触发没有引用计数
- 赋值运算符=总是新开辟一块空间(浅拷贝)
- 友元函数将目标函数标记为自己人,允许访问类中的私有变量
- template定义的函数不是真正的函数,只有当模版被调用时才会根据调用的内容创建函数,只不过调用模版时需要指定输入类型
- auto可以自动推到出被变量或函数返回值的类型
- union是多个变量共用一个内存空间