您的位置:首页 > 编程语言 > C语言/C++

C/C++语法总结

2018-02-04 18:24 162 查看

C/C++语法总结

读《C++ Primer(第5版)》,一些记录

心得①:从右向左、从内向外阅读变量(刨去基本变量类型),如:

int *&r = ptr;// 右向左:r是引用->指针的引用->指向int型指针的引用(p53)

int *const curErr = &errNumb;// 右向左:常量,指针,即curErr为常量指针,curErr不变(p56)

const double *cptr = π// 右向左:指针,常量,即cptr为指针常量,*cptr不变

int *ptrs[10];// 右向左:首先是个数组,数组内容为指针

int (*Parray)[10];// 内向外:首先是个指针,指针内容为数组

int *(&arry)[10] = ptrs;// 内向外、右向左:首先是个引用,引用内容为数组,数组内容为指针

心得②:const作为限定符独立于数据类型和声明符,换言之const很独立,因此:

auto只可替换数据类型和底层const(p62)

decltype则完整包含所有const和数据类型

char类型(p32)

c++中char类型被分为三类:char、signed char、unsigned char,其中char不一定等价于signed char(取决于编译器)

unsigned 与 signed 数运算,结果为 unsigned

例: unsigned u = 10;

int i = -42;

std::cout << u + i << std::endl;

结果:不是-32,而是4294967264

注意的变量作用域(p43-44)

如 for(int val = 1; val <= 10; ++val)

sum +=val;

这里的val,出了for循环就不在作用域内了

定义多个变量时,注意数据类型和类型修饰符(*和&)的位置

如:int* p1, p2; // 注意,这里只p1是指针,p2则是int

常量的共享(p54)

若想在多个文件之间共享同一个常量,必须在其声明和定义时都加extern,如

// file_1.cc 定义并初始化一个常量

extern const int bufSize = fcn();

// file_1.h

extern const int bufSize;

常量引用(指向const的引用)有可能绑定的是一个临时量对象(p55),因此常量引用引用的可能不是一个常量(p56)

不同于一般的引用,常量引用可以绑定非常量的对象、字面值甚至一般表达式,如

int i = 42;

const int &r1 = i; // 绑定一般int对象

const int &r2 = 42; // 正确

const int &r3 = r1 * 2; // 正确

另外,指向常量的指针所指的对象也可能不是一个常量(p56),如

double dval = 3.14;

const double &cptr = &dval;// 正确,但不能通过cptr改变dval的值

typedef不能作为简单的类型替换(p61)注意注意注意注意注意注意注意注意注意注意

如:

typedef char *pstring;

const pstring cstr = 0;// 这里等价为 char * const cstr = 0; 而非 const char *cstr = 0;

如果表达式的内容为解引用操作,则decltype将得到引用类型(p63),如

int i = 42, *p = &i;

decltype(*p) c; // 错误:c是引用类型,必须初始化

decltype((variable))的结果永远是引用(p63)

string的+运算(p81)

string s2 = “world”;

string s7 = “hello” + “,” + s2;// 错误,这里由于计算顺序,”hello” + “,” 先运算,但string的+运算必须保证其中一个加数为string类型 // 字符串字面值不是string类型

vector初始化(p89)

vector v7{10};// 这个等价于vector v7(10);// 这是由于10非string类型,所以这里就成了10个元素了

字符数组使用字符串初始化,需要注意结尾的’\0’(p102)

如:

char a3[] = “c++”; // a3维度为4,即等价于 char a3[] = {‘c’,’+’,’+’,’\0’};

类的operator new

一般格式如 void* classA::operator new(size_t size, mytype_t haha, …);

这里size为编译器指定,在调用时不需要手动指定,如

new(25) classA(…);

25会赋值给haha而非size
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: