c++ primer 第五版随笔

 

1、what is std::endl ?

for example,

std::cout << "hello world" << std::endl;

std::endl是一个函数模板,在这里作为一个函数名,即函数的地址,其为std::ostream operator <<(PFUNC func)的参数,即func即为std::endl, 在operator << 内部调用func(*this),一是用来打印换行符\n,二是用来刷新输出缓冲区。

 

2、what is the difference between sd::cout and std::cerr ?
std::cout 有一个输出缓冲区,从输出缓冲区打印到关联设备(一般是显示器)

std::cerr 无输出缓冲区,直接打印到关联设备(一般是显示器)

 

3、data type of cpp

.... 

wchar_t   4 bytes in gcc 8.3

char16_t   2 bytes in gcc 8.3

char32_T  4 bytes in gcc 8.3

 

4、顶层const 和 底层const

int * const p = &i;   其中p是顶层const,不允许改变p的指向(即不允许改变p的值)

const int *p = &i; 其中p是底层const,不允许改变p指向的内存单元的值,即 *p = value 是错误的!!!

特别的:对const对象取地址的指针是一种底层const指针;

 

推导auto类型时,等号右边的变量的顶层const属性通常被忽略, 底层const属性保留;

推导auto引用类型时,等号右边的顶层const属性需要保留,底层const属性也需要保留;

 

5、decltype

如果decltype(x)中,x是一个变量,那么该decltype表达式返回的该变量的类型包含顶层const和引用;

如果decltype(*p),其中p是一个指针,那么解引用的结果是一个引用,所以decltype(*p) 的类型为一个引用类型;

如果decltype((x)),那么如论x是什么,使用括号的结果一定是引用;

如果decltype(数组),那么结果类型仍然是数组,而非数组地址或首元素地址;

即  decltype(value)的结果取决于value是什么,是引用还是非引用;则 decltype((value))的结果一定是引用。

 

6、头文件

C语言风格 name.h

C++风格  cname  建议使用此种方式 

 

7、存在数组的引用,但不存在引用数组

8、函数重载

函数的参数中,顶层const不能区分不同参数,即 func(int ) 和 func(const int) 是同一个函数;

而底层const则可以区分不同函数参数,即 func(int&) 和  func(const int&) 是不同函数,底层const指针同理;

 

 

9、常量表达式constexpr

修饰函数时,该函数必须有非void类型返回值;

constexpr函数的返回值类型和形参类型都必须是字面值类型,函数体中有且只有一条return语句。

与const不同, constexpr int* p ,该指针p是一个顶层const指针;

 

 10、shared_ptr

auto p = std::make_shared<T>(new T(params));

auto q = p; 引用计数为2

p.get()返回原始指针T*,但是不要这么用

p.reset() 如果此时引用计数为0则释放资源,否则只减少引用计数

p.reset(p2) 如果此时引用计数为0则释放原来资源,否则只减少引用计数,然后重新管理p2所指向的资源,引用激素加1;

数组:auto p = make_shared<T[]>(new T[10]{xxxx}, [](T* p){delete[] p;})   类型为T[]  必须为其指定一个内存删除器;

 

不可以通过原始指针隐式转换为shared_ptr ,即 shared_ptr<T> p = new T(params) 是错误的! 应该是 shared_ptr<T> p(new T(params)) 或者 make_shared<T>(new T(params))

 

11、unique_ptr

独占资源

auto p = unique_ptr<T>(new T(params))

p.release()释放资源控制权(但是资源本身并不管),返回空指针,p为空

p.reset() 释放资源

p.reset(T*) 释放原有资源,重新独占T*

特殊:p.reset(nullptr)释放资源

数组:与shared_ptr不同,不需要指定删除器,即 auto p = unique_ptr<T[]>(new T(params)),默认用delete[] 删除内存;

 

12、析构函数

如果一个类中定义了析构函数,那么它也同样需要拷贝构造和赋值构造,同时编译器不会再为其生成默认的移动move操作函数;

 

13、const和constexpr

const表示为【只读】,constexpr表示为【常量】

 

posted on   崔好好  阅读(21)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
历史上的今天:
2014-12-02 【Linux】Mutex互斥量线程同步的例子

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示