深入理解c++笔记

来源:互联网 发布:java 解决高并发 编辑:程序博客网 时间:2024/06/07 22:09

__func__  函数名字

_Pragma #pragma宏

__VA_ARGS__   不定参数宏

char可转wchar_t

_cplusplus c++宏

static_assert 静态断言

noexcept   是否允许异常关键字(std::terminate终止程序),

templat<class T>

void fun() noexpect(noexpect(T())) {}

快速初始化  类初始化列表优先于就地初始化

struct xxx{

string str{"abc"};

}

final 禁止重载

override 函数必须重载

extern template void fun<int> (int) 外部模板声明减少编译器工作量

继承构造函数 ,父类的默认参数是不会被继承,当多态继承时,构造函数签名冲突,可显式定义继承类冲突的构造函数

class A{

A(int){}

}

class B{

using A::A; // 继承构造函数,不会生成默认的构造函数

}

委派构造函数 不能有初始化列表,目标函数的异常会被委派构造函数捕获

class A{

A(){....}

A(int a):A(){}

}

class A{

A():A(1) {}

A(int a):A(a) {}

private:

A(int a) :m_a(a){.....};

int m_a;

}


移动构造

若无移动构造函数,Class A =std::move(x) 将调用 Class(const Class&)

type_traits

is_rvalue_reference

is_lvalue_reference

is_reference 


utility 

std::move

move_if_noexpect

完美转发 forward<>()

一旦出现左值引用就折叠为左值引用


自定义类型转换 operator ClassName TypeName(){}

explicit 禁用隐式构造,当用于类型转换操作符上时,只有在直接构造目标类型或显式类型转化时候才可以使用


花括号初始化列表  防止类型收窄

int a ={1};

int a{1};

initializer_list 淫技



POD类型  is_pod

平凡的: =default 或不声明 ,is_trivial判断是否平凡

1.有平凡的默认构造析构函数.

2.有平凡的拷贝构造移动构造函数

3.有平凡的拷贝赋值移动赋值函数

4.不含虚函数和虚基类

标准布局: is_standard_layout

1.所有非静态成员有相同的访问权限

2.基类和派生类只有一个包含非静态成员,且非静态成员不能出现在多个基类中. ps..非静态成员只能出现在一个结构中

3.类的第一个非静态成员类型不能与基类类型相同,c++要求类型相同的对象地址必须不同,当派生类第一个非静态成员类型是基类(一个不占空间的基类),编译器依然会给其分配空间 .p102页

4.没有虚函和虚基类

5.所有非静态数据成员,基类都符合标准布局.


编译器会删除一些非受限联合体的默认函数,当含义非POD成员时,会删除其非平凡的构造函数等..


自定义字面量: 字面量为整数 操作符函数只可以接受 unsigned long long 或 const char*,当溢出unsigned long long 时,编译器会转化为字符串并调用const char*参数版本函数

浮点型->long double 或者const char* (过长与上相同)

字符串->只可接受const char*,size_t 为参数的函数

字符->char

returnType operator ""(空格) XXX( type&&){}



inline namespace 声明一个内联命名空间,允许在父命名空间内定义或特化子命名空间的模板

参数关联名称查找:找不到函数名时可在参数的命名空间查找函数名称


is_same 判断两个类型是否相同


auto 类型占位符,不能从初始化表达式中带走cv限制符,加上引用则可以,用于赋值语句多个变量推倒时,变量类型必须相同,且推倒第一个类型作用与其他变量.

不能用作形参,结构体中非静态成员变量,数组,实例化模板时的模板参数


decltype(xxx) 从xxx推倒类型,会带走cv限制符,但结构成员不会继承cv限制符.会忽略沉余符号如cv,&

1.如果e是没有带括号的标记符表达式,或者类成员访问表达式,结果为e的实体类型,若e是被重载的函数,则编译错误

2.否则,e是将亡值,那么结果为T&&

3.否则,e是左值,则结果为T&

4.否则,e是类型T,则结果为T

template <class T1,class T2>

auto fun(T1  t1,T2 t2)->decltype(t1+t2) {}


auto (*)()->int(*)() 返回函数指针的函数 a函数

auto pf1()-> auto (*)()->int(*)()返回a函数的指针的函数

int (*(*pf())())()   { ...}和上面的一样



result_of 推倒函数返回值类型

typeid 返回变量的type_info数据(类型名称,哈希值),is_same 模板是编译时返回,typeid 是运行时


for_each

template<class InputIterator, class Function>  

   Function for_each(  
      InputIterator _First,   
      InputIterator _Last,   
      Function _Func  
      );  

for(type v : arr)  v不是迭代器,是解引用后的对象,自己实现的类必须有begin end ++ == 函数


enum非强类型作用域允许隐式转换为整形

枚举类--强类型枚举 enum class Type: type {xxx};  type是底层类型,除wchar_t的任何整形 enum struct

具有1. 强作用域

2.转换限制

3.指定类型


constexper 编译时常量表达式关键字

常量表达式函数

1.函数体只有单一return

2.必须有返回值

3.return只含常量表达式

4.在使用前必须定义

常量表达式的构造函数

1.函数体为空

2.初始化列表必须为常量表达式赋值


constexper 元编程


stdarg,h  va_list 变长参数 va_start ,va_arg取出参数 

pair<T1,T2>两个不同类型的数据集合

tuple任意个不同类型数据的集合


变长模板

template <typename ... Elements>

sizeof...(args)

参数包展开位置

1.表达式

2.初始化列表

3.基类描述表

4.类成员初始化列表

5.模板参数列表

6.通用属性列表

7.lambda函数捕捉列表


Arg&&...   ----> arg1&&,....argn&&

template <typename ...T>class A:B<T>...{} 

template <typename ...T>class A:B<T1>,B<T2>,B<T3>,.... {} 

template <typename ...T>class A:B<T...>{} 

template <typename ...T>class A:B<T1,T2,T3.....>{} 


template <typename ...T>

void DumpWrapper(T...t){}

template <typename ...A>

void fun(A...a){

DumpWrapper(F(a)....);  //  F(a1),F(a2).......顺序与编译器有关

}

递归和迭代解包


原子类型 cstdatomic.h std::atomic<T>

内存顺序 memory_order


TLS 线程独享变量 int thread_local xxx;

quick_exit 快速结束进程  不析构 at_quick_exit 注册清理函数

nullptr

构造函数名 = default ; 使编译器生成默认版本构造函数

函数名 = delete; 使编译器删除默认版本函数

class(int);

class(char c) = delete;禁用构造隐式转换 ,函数也可以

class xxx('c') ; 编译失败

explicit class(char c)=delete;

void fun(class  o){}

fun('c');  可以编译


void *operator new(size_t)=delete; 禁止在堆上创建对象

删除析构函数禁止在栈上或者静态创建变量,  new(p) Class();假设其不需要析构函数

lambda 可以省略参数括号,在不捕获变量时,可以转换为函数指针,decltype可以获取其类型

[]() mutable{}   取消lambda表达式常量性

struct  alignas(32) xxx{} 对其到32字节边界

alignof() 取类型对齐值

alignas()


[[noreturn]]  表明函数不会返回



  __declspec( property( get = get, put = set ) )  int level;  
 __property int Data = {read=GetData, write=SetData};  

volatile

static_cast  不带cv

const_cast    带cv限定符的转换

dynamic_cast  基类转子类 且有虚函数

reinterpret_cast 函数指针转换


_declspec

_attribute_

register

reinterpret_cast

dynamic_cast

volatile

placement new

^ 异或