C++要点

来源:互联网 发布:闻香知女人小说轩轩 编辑:程序博客网 时间:2024/05/18 12:01

求出两个数中较大的一个 ((a+b)+abs(a-b))/2

_onexit 注册一个或多个在main主函数执行完毕后再执行的函数,注册函数无参数,后注册的函数先运行。

打印源文件名和当前等号 _FILE_ _LINE_

当数组作为函数参数传递时,该数组自动退化为同类型指针

没有任何成员的类的sizeof值为1

内存分配:静态存储区(全局变量或static变量),栈(局部变量),堆(malloc或new)

malloc/free只分配内存,new/delete分配内存并调用构造与析构函数

new[]的对象定义了析构函数,将会在指针之前用一个int存放数组元素数量,delete []时,会根据计数调用每个元素的析构函数

placement new[]时A* p=::new A[5];A* pk=::new (p) A[5];如果A有析构函数,分配的内存会越界,并且会重复构造

main函数执行前会执行全局对象构造函数

0x0A0B 在内存中存放方式是 0B 0A

基类的指针或引用都可以指向派生类的实例,实现多态关系

只要基类的成员函数有virtual属性,子类和孙类此函数都会继承virtual属性

虚基类 B继承A,C继承B和A  或  B和C都继承A,D继承B和C,这时所有继承A的地方要加virtual,否则会重复调用A构造或堆出错或编译不过。

基类中有不同参数的同名函数,如果子类重写了此函数,基类的同名函数将不会被继承下来,基类中此函数的不同参数版本不可被调用。

基类构造后派生再构造,派生析构后基类再析构

构造函数不能为虚函数或纯虚函数

delete指向派生类的基类指针时,如果基类有虚析构时,会先调用派生类析构再调用基类析构,否则只调用基析构。

__cplusplus C++编译; NDEBUG非调试版; _CONSOLE控件台;

一个空类在创建时会根据需要默认创建四个成员函数:构造函数,拷贝构造函数,析构函数,重载赋值操作符

函数返回对象时,如果不直接赋值给一个对象,将自动赋值给一个临时对象并调用拷贝构造函数,出函数时马上调用临时对象的析构函数

explicit的构造函数不能在隐式转换中使用,volatile表示变量随时可以,不可在寄存器里获取

 指针相减不等于指针指向地址相减.指针相减等于两地址差除以指针类型大小,不同类型指针不可相减

int a=0; const int* const c=&a;星号前是值常量,星号后是指针常量,第一个const可以和int互换,结果一样。

函数后面加const为const函数,不可修改成员变量,const函数可做为重载函数,const对象和非const对象都可以调用const函数,cosnt对象不可调用非const函数

mutable指定一个类成员为可变,即使类对象是以const定义,或在const函数中总可以被修改

内联函数编译时做参数类型检查,宏不做类型检查

全局变量定义在cpp中,在h中extern,包含到此h的都可以使用此全局变量.或在h中用static定义全局静态变量.效果一样(函数也一样)

类成员静态常量才能类中初始化,常量成员在构造中初始化,静态成员在类后初始化

数值前缀0八进制,0x十六进制;后缀L或LL表示long或long long;U表示unsigned,f表示float

int a[10]; int (*p)[10]=&a;p指向数组的指针,*p或p[0]首地址指针,**p或p[0][0]或(*p)[0]第一个元素值(方括号优先比星号大)

int a[10][2];int (*p)[2]=&a[0];指向单个数组元素为int a[2]的数组指针,可用p++操作指针.此例跳过2*sizeof(int)个字节

int a[10][2];int (*p)[10][2]=&a;指向二维数组,p++将跳过整个数组,如:10*2*sizeof(int)

int a[10];int (*a)[10];int (&a)[10];数组,数组指针,数组引用,都可用sizeof()得到数组大小,函数参数为int a[]的等于同指针

有符号和无符号数一起运算的结果是无符号

没有成员变量的类sizeof大小为1,有一个virtual以上的虚函数sizeof大小为4

__VA_ARGS__ 转递...形式的参数 

AllocSysString必需用SysFreeString释放

类B继承类A,A* p=new B[2];这时如果B中有成员,p[1];将会错位,因为p是用的sizeof(A)的大小来计算索引位的。

指定一个模版类的友元声明template <class Type> friend class A;

 srand要在每个线程初始化

 

 struct X{
  char s1:4;//从右到左1-4位
  char s2:4;//从右到左5-8位
 } x;

位结构:前面的在低位,后面的在高位

 

static_cast 继承关系转换(下行不安全),无关系转换(编译验证)
dynamic_cast 继承关系转换(上下行安全),必须有virtual函数
reinterpret_cast 强制地址转换
const_cast 移除const, volatile, __unaligned


通过中间指针void*,static_cast 和 reinterpret_cast可在无关指针间转换 

int可通过static_cast转换为enum


delete 删除对象数组,如果对象带析构,会报运行错误

 

原创粉丝点击