重读The C++ Programming Language(一)

 

这些天比较清闲,于是开始重读The C++ Programming Language,发现收获丝毫不比第一次读的时候少,每每有——哇,原来这里有这么清楚地解释——于是列出来,备随时翻翻。

 

//================================================================

 

1,文字量就是一个常量。

2, 字符文字量就是一个值。

3,字符串文字量存在静态区域的常量。两个相同的字符串文字量可能在存储于相同地址(这跟实现有关)。

4, 整数文字量就是一个值,0x1,02,3L,4U。

5, 枚举enum是一种类型,所以不存在存储域的问题,尤其是在类里常常用enum代替常量定义,这种常量仅仅是符号常量,不会占用任何存储。

6,声明中后缀总是拥有更强的约束里,比如 *kings[]表明最终他是个数组。

7,全局的静态的对象总是被默认初始化为0,但是对于栈上分配的对象却没有这样的默认处理。

8,左值的本质含义是表示一块内存。

9,NULL在C中常用,而在c++中尽量用0。

10,引用必须要有初始化,且之后不能改变。

11, 如果用到类型转换的话,请使用T t = T(i);的方式,而不是T t = (T)i;的方式,后一种是C风格的。但是如果说T是指针,那么这将出现问题。

12,类型转换有static_cast,reinterpret_cast,const_cast,dynamic_cast,等操作符。

13,if( bool  b = 1){b;}else{b;},这个bool的b在else的域中同样是有效地。

14,inline不是函数的类型,所以不需要在cpp中出现,而且inline函数不允许被extern申明,即它是内部连接的。

15,同样函数的默认参数也不是函数的类型,所用也不要出现在cpp中。

16,函数的重载不允许仅仅发生在返回值上。

17,const定义的全局变量是内部连接的,即在两个不同的.c文件可以定义相同名字的不同常量值(但这相当的糟糕)。通常都把const常量定义在头文件里。

18,static函数也表示内部连接,但是不要使用。

19, 模版template函数的实现必须放在头文件,在线函数inline也尽量放在头文件里。

20,extern int a这种东西不仅可以而且更应该放在头文件中。所以常量常常是这样的extern const int x;或者干脆const int x = 1;

21, cosnt必须初始化,可以有这样的形式const char c = getchar();

22, C中const常量表示read only,c++保持了这种语义,但是const量在不必要的情况下不会分配存储,而是当做符号常量处理。

23,如果const与指针结合的话会有三种情况,但是char const是不良的表示,而应该使用const char。

24, const在函数参数中表示不可修改,常常与引用一起使用,以消除压栈时间。

25, const作为函数的返回值,这个用处并不是太大。

26, const作为函数的类型,必须是类的成员函数,以便约束数据成员不被这个成员函数修改,同时使得该函数不能调用类的其他非const的成员函数。这里会出现一个逻辑的常量性问题。

27,逻辑的常量性要求成员函数在逻辑上不去修改成员数据,但是可以实际更改类的状态,此时请使用mutable。

28,类可以有const数据成员,表示类的这个成员是个常量,但是这个成员必须要在构造函数列表中初始化,不能在函数体中初始化。

29,类中的常量成员常常用enum来代替,这样的enum是一种类型,并不会占用存储空间。

30,const并不能改变数据的存储区域。即全局的const分配在静态区,局部的const分配在栈中。

31,常量可能并不会有存储空间,而直接被用作符号代换。

32, static修饰全局变量是表明其位于静态区,仅仅为本模块可见,与extern相对应。修饰全局函数同样如此(不建议这样修饰函数,尽管C中大量的这么用)。

33,static修饰局部变量是表明该变量不再在栈上分配,而是跟全局变量一样在静态区分配,但是却不具备全局变量所具备的全局可见性,仅仅是局部可见。

34,static修饰类的成员变量时表明该成员变量为类的所有对象共有,必须要在类域的外面做初始化处理。

35,static修饰类的成员函数时表明该函数仅仅能访问类的static成员,因为他没有this指针。

36,const static如果修饰全局变量,表明为本模块的常量。

37,const static如果修饰类的成员,则成员类型仅仅为int,且必须在类声明时初始化成员。

38,extern表明外部性,某种程度上跟include有相同的功能。

39,再两个没有命名的名字空间中的函数同样可以重载。但是如果名字空间的命名不同则不行。

40,不要include没有必要的文件,这将使编译单元更加混乱,而导致莫名其妙的问题。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux中,"重定向"(Redirection)是一种强大的I/O操作,它允许我们将标准输入、输出或错误流重新定向到文件、设备、管道或其他程序的输入。这在很多场景下非常有用,例如输出结果到文件、捕获程序的输出、修改输入数据等。这里简要介绍几个常见的重定向操作: 1. 输出重定向 (`>` 或 `>>`): - `>`:覆盖写入,如果文件已存在则先删除再写入。 - `>>`:追加写入,如果文件已存在则在末尾添加内容。 2. 输入重定向 (`<`): 用于将文件内容作为程序的输入,如 `command < inputfile`。 3. 标准错误重定向 (`2>` 或 `2>>`): - `2>`:类似输出重定向,将错误信息写入指定文件。 - `2>>`:追加错误信息到文件。 4. 输入输出重定向 (`<>` 或 `|`): - `<>`:通常用于替代环境变量 `$0`,如 `grep keyword <> file`。 - `|`:管道操作符,允许将一个命令的输出作为另一个命令的输入。 5. 输入输出重定向结合标准错误 (`>>&`): - `>>&`:将输出和错误同时重定向到同一个文件。 6. 临时文件重定向 (`<>` 结合 `mktemp`): 使用 `mktemp` 创建一个临时文件,并将其用于输入输出,如 `command <> $(mktemp)`。 7. 双向重定向 (`tee`): `command | tee outputfile`,将命令输出复制到屏幕和文件中。 了解这些基本的重定向操作后,你可以在编写脚本或日常命令行操作中灵活运用,以满足特定需求。如果你有更具体的问题或想深入了解某个方面,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值