第2章 

整型的赋值:当我们试着把一个超出其范围的值赋给一个指定类型的对象时,结果如何?答案取决于类型是signed还是unsigned的。对于unsigned,编译器会将该值对unsigned类型的可能取值数目求模然后取所得值;对于signed类型,未定义行为,很多处理器处理方式和unsigned类似。

字符串字面值的连接:std::cout << "multi-line" L"literal " << std::endl;结果未定义,即连接不同类型的行为标准未定义。

const:全局作用域声明的const对象默认为文件的局部变量,非const变量默认为extern,要使const变量能够在其他文件访问,必须显示指定为extern。

顶层const,规定某对象的值不能变;底层const,类型如果由底层常量定义,则不能忽略。

更多关于const的资料

引用:一般引用为左值引用,即只能绑定到对象上。const引用可以绑定到非常量的对象或一般表达式。右值引用必须绑定到右值表达式。

double d = 1.0;

const int &x = d;//ok

const int &y = 4; //ok

int &z = 4;//error

int &&zz = 4;//右值引用,ok

总结:

非常量左值引用:只能绑定到非常量左值

常量左值引用:可以绑定到所有类型的值,包括非常量左值、常量左值、非常量右值和常量右值

非常量右值引用:只能绑定到非常量右值

常量右值引用:只能绑定到非常量右值和常量右值

 

指向指针的引用:int *p; int *&r = p;//从右往左读,r是一个引用,引用一个指针,这个指针指向int

类型别名:typedef 

注意,typedef char *pstring; const pstring cstr = 0;const pstring是一个指向char的常量指针。

头文件:头文件用于声明而不是用于定义,但有三个例外:1.可以定义类 2.可以定义const对象 3.可以定义inline函数。

(在头文件中加入或修改内联函数时,使用了该头文件的所有源文件都必须重新编译)

auto说明符:auto定义的变量必须有初始值,由编译器通过初始值来推断类型。一条声明语句中,只能有一个基本类型。

auto i = 0, *p = &i;//ok

auto sz = 0, pi = 3.14;//error, 类型不同 

 

第3章 

命名空间的using声明:有一种情况下,必须总是使用完全限定的标准库名字:在头文件中。即头文件中,不该用“using namespace std; cout << endl; ”,而该用"std::cout << std::endl;"

理由是头文件的内容会被预处理器复制到程序中,会造成包含该头文件的每个程序中都放置了同一using声明,不论该程序是否需要using声明。

:: operator操作符 : 作用域操作符。在其左操作数的作用域内找到其右操作数的名字。用于访问某个命名空间的名字,如std::cout,同样地,可用于从某个类取名字,如string::size_type。

指针和const限定符:

const int a 等价于int const a。

const int *p 等价于 int const *p, 表示一个指针,指向int类型的const对象。

int * const p表示一个const指针

记忆:const在*前还是*后

多维数组和引用,指针

int ia[3][4];

int (&row)[4] = ia[1];//即*(ia+1)

int (*p)[4] = ia+1;//从右往左读,p是一个指针,指向一个维度是4的数组,数组的元素类型是int型。

*(*p+2) = 233;//ia[1][2] = 233

 用typedef简化指向多维数组的指针:

typedef int int_array[4];

int_array *ip = ia;

 

第6章 

常见宏用法

1 防止一个头文件被重复包含 
#ifndef BODYDEF_H 
#define BODYDEF_H 
 //头文件内容 
#endif
 

2 得到指定地址上的一个字节或字
#define MEM_B( x ) ( *( (byte *) (x) ) ) 
#define MEM_W( x ) ( *( (word *) (x) ) )


3 得到一个field在结构体(struct)中的偏移量
 #define OFFSETOF( type, field ) ( (size_t) &(( type *) 0)-> field )


4 得到一个结构体中field所占用的字节数 
#define FSIZ( type, field ) sizeof( ((type *) 0)->field )


5 得到一个变量的地址(word宽度) 
#define B_PTR( var ) ( (byte *) (void *) &(var) ) 
#define W_PTR( var ) ( (word *) (void *) &(var) )


6 将一个字母转换为大写
#define UPCASE( c ) ( ((c) >= ''a'' && (c) <= ''z'') ? ((c) - 0x20) : (c) )


7 判断字符是不是10进值的数字
#define DECCHK( c ) ((c) >= ''0'' && (c) <= ''9'')


8 判断字符是不是16进值的数字 
#define HEXCHK( c ) ( ((c) >= ''0'' && (c) <= ''9'') ||((c) >= ''A'' && (c) <= ''F'') ||((c) >= ''a'' && (c) <= ''f'') )


9 防止溢出的一个方法 
#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))


10 返回数组元素的个数 
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )


11 使用一些宏跟踪调试
ANSI标准说明了五个预定义的宏名。它们是: 
_LINE_ /*(两个下划线),对应%d*/
_FILE_ /*对应%s*/
_DATE_ /*对应%s*/
_TIME_ /*对应%s*/
View Code

相关文章:

  • 2021-06-26
  • 2021-07-22
  • 2022-01-03
  • 2022-01-16
  • 2021-10-10
  • 2021-10-13
  • 2022-01-17
  • 2021-10-11
猜你喜欢
  • 2022-01-07
  • 2022-12-23
  • 2021-12-04
  • 2021-12-31
  • 2021-04-02
  • 2021-12-05
  • 2022-12-23
相关资源
相似解决方案