zoukankan      html  css  js  c++  java
  • c++Primer再学习(1)

    记录再学习过程中,对c++primer各章节中的一些之前不明白或是忽略的知识点的笔记。

    第一~七章

    1.在头文件中,必须总是使用完全限定的标准库名字
    2.不要把string::size()的返回值赋给一个int的变量,而应使用string::size_type。同样的道理,string对象的索引变量最好也用string::size_type
    3.在多数计算机上,任何一个大写字母都小于任意的小写字母
    4.end操作返回的迭代器不指向任何元素,因此不能对它解引用或自增操作。但值不为空
    5.任何改变vector长度的操作都会使已存在的迭代器失效
    6.string对象和bitset对象之间是反向转化。 string对象的最右边字符用来初始化bitset对象的低阶位
    7.数组维度在c++11标准中可以使用constexpr声明定义的编译期常数,其他标准是不合法的
    8.如果对左操作数进行解引用,则修改的是指针所指对象的值;如果没有使用解引用操作,则修改的是指针本身的值
    9.声明定义一个指针是会分配内存的,而引用是变量的别名不分配内存
    10.const在*的左侧则声明的是指针所指对象不能被修改(无论所指对象是否const) const在*右侧则声明的是指针本身常量无法被修改,而其所指对象可被修改
    11.c风格字符串是以'\0'(null)结尾的字符数组
    12.标准库函数strlen计算c风格字符串中的字符个数,不包括null结束符
    13.指向数组的指针  T (*variable_name)[array_size]  <=> typedef T <typename>[array_size]; <typename> *variable_name = xx;
    View Code
     1 #include <iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     int ia[3][4] = { {1,2,3,4}, {5,6,7,8}, {9, 10, 11, 12}};
     7     int (*p)[4] = ia;
     8     for(; p != (ia + 3); ++p)
     9     {
    10         for(int *q = *p; q != (*p + 4); ++q)
    11         {
    12             cout << *q << " ";
    13         }
    14         cout << endl;
    15     }
    16     
    17     int ib[4] = { 1, 2, 3, 4};
    18     int *ip[4] = { &ib[0], &ib[1], &ib[2], &ib[3]}; // 可看成是 int*  ip[4]; ip是一个含有4个int*成员的数组
    19     for(int i = 0; i != 4; ++i)
    20     {
    21         cout << ip[i] << endl;
    22     }
    23     return 0;
    24 }
    14.对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以应使用unsigned整型操作数
    15.& 全1为1; |全0为0; ^不同为1;
    16.后自增或后自减操作优先级高于解引用(*)操作符
    17.sizeof(expr) ,获得该表达式的结果的类型长度,而不计算表达式expr的值。
    18.assert  #include <cassert>只有在未定义NDEBUG时才有效,在定义了NDEBUG的代码中,assert不做任何工作,因此没有运行时代价,也不会在运行时做任何检查。所以不能用来代替运行时的逻辑检查,也不能代替对程序可能产生的错误的检测
    19.将不需要修改的引用形参定义为const引用。普通的非const引用形参,既不能用const对象初始化,也不能用常量字符串或产生右值的表达式实参初始化
    20.形参从右向左理解 int*& i -》理解为 int*  &i  i是一个int指针的引用
    21.应避免使用vector等容器类型的非const形参,而使用迭代器作为形参传递
    22.通过引用传递数组,不复制,传递引用。编译器检查数组实参的大小与形参的大小是否匹配 形参名与&必须以(),因为[]下标操作符优先级高于&
    23.多维数组形参以数组名传递且其他维必须明确大小。例: void print(int (*arr)[10], int row)     *arr的括号是必需的 。编译器会忽略多维数组形参中的第一维大小 void print(int arr[][10], int row)
    24.如果函数的返回值类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。当函数返回非引用类型时,其返回值即可以是局部对象,也可以是求解表达式的结果
    25.千万不要返回局部对象的引用,千万不要返回局部对象的指针
    26.在头文件中加入或修改内联函数时,使用了该头文件的所有源文件都必须重新编译
    27.const对象,指向const对象的指针或饮用只能用于调用其const成员函数,如果尝试用它们来调用非const成员函数则是错误的。非const的对象即可以调用类的const成员函数也可以调用非const成员函数。
    28.编译器生成的默认构造函数不会自动初始化内置类型的成员
    29.函数指针可以作为函数的形参。两种编写形式
    void useBigger(const string&, const string&, bool (*)(const string&, const string&) );
    void useBigger(const string&, const string&, bool (const string&, const string&) );
    30.返回指向函数的指针。从声明的名字开始由里向外理解
  • 相关阅读:
    Qt线程的简单使用(四)——QSemaphore的使用
    Qt线程的简单使用(三)——通过一个实例理解QMutex的使用
    Qt线程的简单使用(二)——通过继承QThread()创建线程
    Qt线程的简单使用(一)——通过QObject::moveToThread()创建线程
    高斯投影与UTM的异同
    基于Qt的Tcp协议的流程图
    OC系列高级-block
    OC系列foundation Kit基础-NSDate
    OC系列高级-内存管理关键字
    OC系列高级-NSValue
  • 原文地址:https://www.cnblogs.com/neking/p/2825563.html
Copyright © 2011-2022 走看看