c++primer笔记
加入光荣的进化吧
数组!
标签: 数组
- 与vector不同的是,数组的大小确定。所以对于某些特殊的应用来讲,程序运行时性能较好。
在不清楚元素的个数时,使用vector!
这里说的“数组” 不仅是
int a[10]
,也包括了string a[10]
;- int/string [数组名字][维度] ; 维度只能用常量const表示
类似于内置类型的变量,当定义了内置类型的数组时,默认初始化会令数组含有未定义的值。
><这是什么鬼东西- string不是内置数据类型, int是内置数据类型!
- 用int定义的数组若为全局的,则被默认初始化为0,若为局部的,则为随机值。
- 而string定义的字符数组,不论定义在哪,都不初始化,或者理解成初始为空。
字符数组! string a[6]=”hallo”; 字符串字面值是五个字符,但末尾还有一个‘/0‘ 所以应该定义维度为6
- 不能将数组内容拷贝给其他数组,也不能用数组为其他数组赋值
int *a[10]; //a数组含有10个指针整形
int &a[10]; //错误,不存在引用的数组
int (*a)[10]; //a是一个指针,指向一个含有10个整数的数组
int (&a)[10]; //a是一个引用,引用一个含有10个整数的数组
int *(&a)[10]; // a是数组的引用,数组含有十个指针
↑ 理解方法:从数组的名字开始,由内向外的顺序读取,先左后右,左边为类型。
数组的下标的数据类型: size_t
size_t 是一种机器相关的无符号类型,它被设计的足够大以便能表示闪存中任意对象的大小。 在cstddef头文件中定义了size_t类型。 这个头文件是c标准库stddef.h的c++版本。
范围for语句:
标签: 范围for
cpp
for(auto i :scores)
cout<<i<<" ";
cout<<endll
for ( for-range-declaration : expression ) statement
使用基于范围的 for 语句构造一个必须执行的循环范围,可以定义为任意一个循环访问,例如 std::vector,或者其他任意用 begin() 和 end()定义的范围。 命名在 for-range-declaration 语句是属于 for 的,不能在 expression 或 statement中再次声明。 请注意 自动 关键字是在 for-range-declaration 中部分语句的首选。
c++中的const和constexpr
标签: const和constexpr
constexpr是C++11中新增的关键字,其语义是“常量表达式”,也就是在编译期可求值的表达式。最基础的常量表达式就是字面值或全局变量/函数的地址或sizeof等关键字返回的结果,而其它常量表达式都是由基础表达式通过各种确定的运算得到的。constexpr值可用于enum、switch、数组长度等场合。
C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象的常量性的操作都视为error。
const并未区分出编译期常量和运行期常量
constexpr限定在了编译期常量constexpr修饰的函数,简单的来说,如果其传入的参数可以在编译时期计算出来,那么这个函数就会产生编译时期的值。但是,传入的参数如果不能在编译时期计算出来,那么constexpr修饰的函数就和普通函数一样了。不过,我们不必因此而写两个版本,所以如果函数体适用于constexpr函数的条件,可以尽量加上constexpr。
作者:蓝色
链接:https://www.zhihu.com/question/35614219/answer/63798713
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
指针和数组
指针的数组有非常紧密的联系。使用数组的时候,编译器一般会把它转换成指针。
- 在大多数表达式中,使用数组类型的对象,其实是使用一个指向该数组首元素的指针。
cpp
string nums[]={”ont“,"two"};
string *p=&nums[0];
string *p2=nums; //等价于 p2=&nums[0]
- 指针也是迭代器!
cpp
int arr[]={0,1,2,3,4,5,6,7};
int *p=arr; ///p指向arr[0]
++p; ///p指向arr[1] (p在地址空间移动sizeof(int)个单位)
- 迭代器的end:
- arr中有8个元素 使用 int *e= &arr[9];
- 指针e指向了最后一个元素后面的元素的地址。
- 这时就可以用for循环 for(int *b=arr; b!=e; ++b); 遍历数组
- C++11的end求法:
- last指向的是arr尾元素的下一位置
- 尾后指针不能执行解引用和递增操作
cpp
int ia[]={1,2,3,4,5,6,7,8,9};
int *beg = begin(ia);
int *last = end(ia);
- 迭代器的end:
指针运算
- 给一个指针加上或减去一个整数值,结果仍是指针。新指针所指元素为原来指针所指元素前移或者后移N位。
- 两个指针相减 ,得到的是他们之间的距离。参与运算的两个指针必须指向同一个数组当中的元素。
- 数据类型为 ptrdiff_t, it is same as “size_t”, 差值可能为负,所以该数据类型为带符号类型。
C风格字符串
- 这个。。 恩。。。 很不方便 所以 一般不用。。
- 头文件 #include
- strlen(p) 返回p的长度,空字符不计算在内
- strcmp(p1,p2) ,比较p1和p2. 若相等 返回0,若p1>p2 返回正值, 小于则返回负值。
- strcat(p1,p2) 将P2附加在P1之后,返回p1
- strcpy(p1,p2) 将p2拷贝给p1 ,返回p1
c++ string和 c的char[] 的接口:
- 混用string和c风格字符串
- const char *str=s.c_str();
- ==s.c_str()== 返回值就是首字符的指针!
- 使用const char *str 确保不会改变字符数组的内容。
- 顶层const : 不能改变所定义的对象的值
- 底层const : 可以改变所定义的对象的值,但不能改变指针所指的对象。 如 const int *p2 = &ci ;
- const int *const p3 = p3; 右边是顶层const 左边是底层const;
现代的C++程序应尽量使用vector和迭代器, 避免使用内置数组和指针;应该尽量使用string,避免使用c风格的基于数组的字符串。
- 多维数组
- C++中并没有多维数组,通常说的多维数组其实是数组的数组。
- 当一个数组的元素仍是数组时,就使用两个维度来定义它。
- int ia[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 自动区分行、列
- int ia[3][4]={{0,2,3,4},{1},{2}}; 也可以每行每列都定义。未列出的元素执行默认值初始化。
C++11 可以用范围for来处理多维数组。
- ==太长了懒得看。。==
指针和多维数组
- 多维数组是数组的数组。所以也是指针的数组
- int ia[3][4];
- int (*p)[4] = ia;
- 上述声明中,圆括号必不可少
- int *ip[4]; ///整形指针的数组
- int (*ip)[4]; ///指针指向含有四个整数的数组
int *p[10]; //首先是一个数组,含有10个指针元 int (*p)[10]; // 一个指向含有10个元素的数组指针