cpp summary c++语法总结

大小端存储与判定

  • 大端存储:“人类读的正常顺序” msb在低位 (最高有效位,英文全称是:the Most Significant Bit,缩写为:msb,是指一个n位二进制数字中的n-1位,具有最高的权值2^(n-1)。与之相反的称之为最低有效位。在大端序中,msb即指最左端的位。)
  • 小端存储:略
  • 字符指针判断在32位平台下,int占4个字节,而char类型的指针是占一个字节的,如果我们把int强传为char类型的指针,只会保存一-个字节的数据,那么我们只需要判断char里面的第-一个字节和int里面的第–个字节是否是一致即可判断。如果-致则为小端模式,反之为大端模式。

linux上的环境设置

如何在Visual Studio中调试代码

C++是如何工作的

编译器如何工作

  • 在编译的时候,程序是按照每个.C或.CPP文件单独编译的。

链接器如何工作

头文件

  • 头文件即为在预处理阶段的简单的复制和替换
  • 【C语言的编写时,头文件只能有一个吗!不是】

函数调用过程的入栈

  • 函数的参数按照从右向左入栈(这样第一个在上边)
  • 函数中临时变量,按照定义顺序入栈
  • 形参在调用时分配存储单元,调用结束释放
  • 参数非指针时,形参重新复制数值,不会改变实参的值

命令行执行exe时的多个参数转为数组 C语言中 int main(int argc,char *argv[])

指针+引用

  • 指针是一个整数, 一种存储内存地址的数字。引用int& 是别名。
  • 引用使用方法void foo(int& a){a++;} {int a=5;foo(a);}

C++类,类与结构体

  • class A{};和结构体struct A{};没有什么区别,只是类的默认成员是私有的。

C++中的静态(static)

  • 静态 static 停滞静止的意思,猜想其有关的功能应该是保持常量 或者 具有某种唯一性
  • 防止跨编译单元链接,同时具有唯一全局的性质
  • 当变量声明为static时,空间将在程序的生命周期内分配,其被存放在在全局数据区(若定义在函数内,函数退出后仍存在,但是无法被使用)。
  • 类成员变量:不能在类声明中初始化,需要定义类从属int A::x;(类外),类外初始化A::x = 3;
  • 静态成员函数:无法访问非static的成员,但可以被非static函数访问。this为实例指针,static与类绑定所以也不能用。

extern

C++中静态变量的初始化时间

const

  • 类似static, 防止跨编译单元链接,同时具有唯一全局的性质
  • 不变承诺 void foo(const int a)保证传入的参数在函数中不被修改,但是跳出函数后还正常
  • 声明同时初始化赋值
  • const成员函数:无法访问非const的成员,但可以被非const函数访问。不能改变类中不被mutable修饰的成员。
  • const和* “复合”:先看const左侧再看const右侧,const int*指向的值不能改变, int* const地址不能改变(int* const b= &a;)

inline

  • 内联函数 在编译时直接类似宏定义将执行代码复制过来减去调用加快运行速度(#define MAX(a,b) ((a)>(b)?(a):(b)) /*这些括号防止歧义*/宏定义是预编译直接替换所以有时会有差错,且无类型检查),如果两个文件都引用同一个头文件会链接时会出现重复函数定义错误,也可用inline标注

final override

  • override在重写父类函数时进行校验,父类没有函数则会报错。

在头文件实现函数的重定义问题,方法一: 添加inline标识,添加完inline bool Func () {return true;} 方法二: 添加static标识 static bool Func () {return true;} 方法三: 放入到类中 class A { public:bool Func () {return true;} } 方法四:函数实现在headfile.cpp中,头文件只保留声明。

explicit 防止函数中发生隐式转换

  • opencv的VideoCapture类中的函数例子
    cpp summary c++语法总结_第1张图片

volatile多任务的情况下使用

C++ 构造与析构函数

c++的构造函数

  1. 默认构造函数
  2. 初始化构造函数
  3. 拷贝构造函数 :复制构造A a;A b(a);A a;A b=a;
  4. 移动构造函数:右值引用的作用是实现移动构造,通过A a;A b(std::move(a));

C++中左值和右值的理解,首先,让我们避开那些正式的定义。在C++中,一个左值是指向一个指定内存的东西。另一方面,右值就是不指向任何地方的东西。通常来说,右值是暂时和短命的,而左值则活的很久,因为他们以变量的形式(variable)存在。我们可以将左值看作为容器(container)而将右值看做容器中的事物。如果容器消失了,容器中的事物也就自然就无法存在了。移动构造函数

C++的动态数组(std::vector)

字符串

const , mutable

C++的三元操作符

创建并初始化C++对象

C++ new关键字(在堆上分配返回地址 malloc)

  • C++中有几种类型的new 在C++中,new有三种典型的使用方法:plain new,nothrow new和placement new

  • delete delete[]

// https://learn.microsoft.com/en-us/cpp/cpp/new-operator-cpp?view=msvc-170
char (*pchar)[10] = new char[dim][10];
delete [] pchar;// delete[] 元素逆序销毁
  • new的过程会分配内存和构造,allocator可以实现只分配内存

C++隐式转换

C++运算符及其重载(java中为什么使用equals())

bool operator ==(){
return true;
}
  • opencv的VideoCapture的 >>
    cpp summary c++语法总结_第2张图片
  • 断点,按F11跟进去找到实现:
    cpp summary c++语法总结_第3张图片

C++的this关键字

  • this相当于一个自带的成员变量
  • this指向当前实例(有点像self)的指针。

C++的对象生存期(栈作用域生存期)

C++的智能指针

野(wild)指针与悬空(dangling)指针

设计模型

C++继承+虚函数

继承

  • 父类公有成员和保护成员都作为子类的私有成员 class B : private A
  • 关于public,protected,private三者继承后的情况是三个依次增强

virtual

  • 重载和Virtual没有任何瓜葛,加不加都不影响重载的运作。
  • 包含一个或多个纯虚拟函数的类被编译器识别为抽象基类。抽象基类不能被实例化,一般用于继承。
  • 虚函数的使用(重写 覆盖的几个函数必须函数名、参数、返回值都相同):通过基类指针或引用间接指向派生类子类型Base *b = new Derived;(Base的函数标注virtual)
  • 多态实现原理

虚拟继承class B : public virtual A{}

  • 在多继承下,虚继承就是为了解决菱形继承中,B,C都继承了A,D继承了B,C,那么D关于 A的引用只有一次
  • 深入理解virtual关键字
  • 动态链接是多态性

静态类型 动态类型

  • 静态类型:在编译器能确定的类型
  • 动态类型:在运行期确定所指的类型

组合

class head
{};
calss human
{
private:
    head h;  // 数据成员对象表示的组合关系 https://www.jianshu.com/p/5ba247507f7d
}

模板

模板函数

template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表) {函数体}

template<typename T> 
int foo(const T& a, const T& b)     {if (a< b) {return 1; }return 0; }
foo(100,101);//调用会自动推断类型

类模板

template<class  形参名,class 形参名,…>   class 类名
{ ... };

CG

  • 如何在不适用额外空间情况下交换两个整数?x=x+y;y=x-y;x=x-y;
  • 内存泄漏(忘记free内存导致无法被使用)的避免? 将基类的析构函数声明为虚函数delete p;时delete指针时先释放子类,后释放父类;检测工具CRT库或Valgrind。

你可能感兴趣的:(语言学习笔记,c++,开发语言,mfc)