2017-5-10 c++ primer笔记

来源:互联网 发布:网页游戏如何修改数据 编辑:程序博客网 时间:2024/06/03 20:35

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);
  • 指针运算

    • 给一个指针加上或减去一个整数值,结果仍是指针。新指针所指元素为原来指针所指元素前移或者后移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个元素的数组指针  

END 2017年5月11日01:06:00

0 0
原创粉丝点击