CPPprimer第三-七章

字符串、向量和数组

using

  • 有了using声明就不需要专门前缀去使用所需的名字了:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <iostream>
    using std::cin;

    int main(){
    int i;
    cin>>i;
    std::cout<<i;
    return 0;
    }
  • 位于头文件的代码,一般来说不应该使用using声明,因为头文件的内容会拷贝到所有引用他的文件中去,如果头文件里有某个using的声明,那么每个使用该头文件都会有这个声明。

string

  • 有时我们需要能在得到的字符串中保留输入时的空白符,这时应该用getline函数代替原来的>>运算符。

    1
    2
    3
    4
    5
    6
    7
    int main(){
    string line;
    while(getline(cin,line)){
    cout<<line;
    }
    return 0;
    }
  • 当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符+两侧的运算对象至少有一个string(字面值不是string)

表达式

显式转换

  • static_cast

    任何明确定义的类型转换,只要不包含底层const,都可以用static_cast:

    double slope = static_cast<double>(j)/i;

  • dynamic_cast

    我们在后面再讲

  • const_cast

    去掉const属性:

    1
    2
    const char *pc;
    char *p = const_cast<char*>(pc);
  • reinterpret_cast

    非常危险,避免使用

语句

switch

尽管switch语句不是非得在最后一个标签后面写上break,但是为了安全起见最好这么做。

函数

内联函数和constexpr函数

  • 内联函数可避免函数调用的开销

  • constexpr函数指能用于常量表达式的函数

    1
    2
    3
    4
    constexpr int new_sz(){
    return 42;
    }
    constexpr int foo = new_sz();

    需要注意的是,函数的返回类型,所有形参类型都必须是字面值类型

  • inline和constexpr函数一般定义在头文件中

函数指针

普通函数:

bool compare(const string &,const string &);

函数指针:

把compare改成(*pf)即可

pf两边括号必不可少,否则则代表返回值为bool* 指针的函数

  • 一般来说,如果非成员函数是类接口的组成部分,则这些函数的声明应该与类在同一个头文件中

访问控制和封装

  • 定义在public说明符之后的成员,在整个程序内可被访问,public成员定义类的接口

  • 定义在private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private相当于就是部分封装了类的实现细节

  • class和struct:

    唯一的区别就是默认访问权限不同,struct关键字默认是public,class默认是private

友元

既然Sales_data的数据成员是private的,我们的接口read、print和add函数也就无法正常编译了,这是因为尽管这几个函数是类的接口的一部分,但他们不是类的组成成员,所以我们需要增加一条friend关键字开始的函数声明语句

friend std::ostream &print(std::ostream&,const Sales_data&);

然后后面重新声明这个函数:

std::ostream &print(std::ostream&,const Sales_data&);

其他特性

  • 即使两个类的成员列表完全一样,他们也是两个类型

  • 为了完成任务,clear需要访问Screen的私有成员,要让这个访问合法,要让Screen把window_mgr指定成它的友元:

    1
    2
    3
    class Screen{
    friend class Window_mgr;
    }

静态成员

  • 类的静态成员存在于任何对象之外,对象中不包括任何与静态数据成员有关的数据,static成员被所有类的对象共享。
  • 虽然静态成员不属于类的某个对象,但是我们仍然能够使用类的对象、引用以及指针来访问静态成员,成员函数不需要作用域运算符就能使用静态成员

到这里第一部分就看完了,都是很基础的东西,我只记录了一些记忆不深的点