Advertisement

Essential C++读书笔记

阅读量:

Essential C++读书笔记

一、C++编程基础

1、对象初始化 (两种不同的初试化语法)

int num_tries = 0, num_right = 0

int num_tries(0)//构造函数语法,主要用来处理“多值初试化”

复制代码
    #include<complex>

    complex<double> purei(0,7);
2、特殊字符

当在Windows操作系统中使用常量字符串来表示文件路径时,应以特殊符号来表示斜杠

复制代码
    ”F:\ essential\ pragrams\ charpter1\ ch1_main.cpp“
3、const 常量

被定义为const的对象在获得初值之后无法进行变动

复制代码
    const int max_tries = 3;
    const double_PI  = 3.14
4、条件判断

switch

请特别注意:当某标签与switch表达式的值匹配时,在这种情况下其后的所有case标签也会被依次执行;只有在明确使用break语句来终止执行的情况下才会停止

复制代码
    switch(num_tries)
    {
    case 1:
        cout<<"\n";
        break:
    case 2:
        cout<<"  ";
        break;
    default:
        cout<<"    ";
       	break;
    }
5、arrays和Vectors

初始化 :利用已初始化的array作为vector的初值

复制代码
    int elem_vals[seq_size]={1,2,3,4,5,6,7,8};
    vector<int> elem_seq{elem_vals,elem_vals+seq_size};

vector 可以知道自身的元素个数

复制代码
    elem_seq.size()
6、指针

防止对NULL指针进行操作可以检验该指针所含有的地址是否为0

复制代码
    if(pi && *pi != 1024)
    {
    *pi = 1024;
    }

对于vector的指针的声明以及初始化

复制代码
    vector<int> *pv = 0;

定义vector的指针数组

复制代码
    vector<int> *seq_addrs[seq_cnt]={&fibonacci, &lucas, &pell, &triangular}

rand()和srand()函数

rand函数每次调用会生成一个位于0到int所能表示的最大整数值之间的整数值。
srand函数接受并设置随机数生成器的种子参数seed。
将随机数生成器的种子设定为5后,则可以使rand函数产生的数值限定在0至5之间。

7、文件的读写

声明 outfile 后:若指定的 file 不存在,则生成该 file;否则此 file 会 open 用于输出,并将原 file 的数据移除。

复制代码
    #include<fstream>
    ofstream outfile("seq_data.txt");//输出模式
    ifstream infile("seq_data.txt");//读取模式
    fstream iofile("seq_data.txt",ios_base::in|ios_base::app)//读写模式,追加模式

追加模式 开启文件

复制代码
    ofstream outfile("seq_data.txt",ios_base::qpp);
复制代码
    if(!outfile)
    cerr<<"Unable to save!"//cerr代表标准错误输出设备
    else
    outfile<<user_name<<endl;

当启动为附加模式时,在未进行过定位操作的情况下,默认情况下会将当前位置设置于尾部区域,并尝试进行当前内容的读取操作,则必然会导致无法完成该操作。通过调用seekg()函数可将当前路径下的起始位置重置至整个文件的开头部分。

复制代码
    iofile.seekg(0)

二、面向过程的编程风格

1、撰写函数

为了能够调用函数的需求而言,在编程过程中必须进行函数声明。通常情况下,在编写程序时会将函数声明放置在包含所需功能的头文件中;特别地,在像cstdlib.h这样的标准库头文件中特意包含了exit()函数的声明。

复制代码
    int fibon_elem(int pos)//即函数原型,不需要写函数主体

使用**exit()**必须包含头文件

复制代码
    #include<cstdlib>
2、调用函数

当我们在执行某个函数操作时,在虚拟机的内存空间中临时创建出一个特定区域(被称为"堆栈"),这个区域主要负责为每个待传递的数据参数提供存储位置,并且还能为每个被定义的对象分配独立的空间;当该操作完成之后系统会自动释放这些临时占用的空间

3、引用
复制代码
    int ival = 1024;//对象,类别为int
    int *pi = &ival;//指针
    int &rval = ival;//引用,代表一个int对象
    int jval = 4096;
    rval = jval;//即把jval赋值给rval所代表的对象,即ival

C++不允许改变引用所代表的对象

4、生存空间及生存范围

除static以外,函数内定义的对象只存活与函数执行之际

变量若不在函数体内声明,则自其声明位置至文件末尾始终可见,并必被初始化为0

5、动态内存管理

不管是在本地范围还是在文件范围内。
另外一种情况是动态范围(Dynamic Range),其内存来源于程序的自由空间配置(也称为堆内存)。
这种内存必须由程序员自行进行管理。
其配置可以通过new expression实现。
而释放则通过delete expression完成。

复制代码
    int *pi;
    pi = new int(1024);
    int *pia = new int[24];//配置数组,C++不可以从heap配置数组的同时为其元素设定初值
    delete pi;//
    delete []pia;//删除数组中的所有对象

如果不适用delete,则从heap配置来的对象永远不会释放,即内存泄漏

6、提供默认参数值
复制代码
    void display(const vector<int> &vec,ostream &os =cout)//将cout设置为默认的ostream参数
    {
    for(int ix = 0;ix<vec.size();++ix)
        os<<vec[ix]<<' ';
    os<<endl;
    }

默认参数值提供的两个规则

  • 如果某个参数设置了一个默认值,则该参数右侧的所有后续参数都必须也设定有默认值。
    • 每个默认值只能指定一次。
7、声明inline函数(还不懂)

旨在具体而言,在进行程序优化时。对于被声明为inline的那些子程序而言,在执行每个子程序调用时直接展开该子程序的具体内容,并将其作为独立的一份代码块进行处理。这样一来,在运行相应的程序段时会显著提高其执行效率

复制代码
    inline bool_fibon_elem(int pos, int &elem)
    {
    //内联函数必须跟函数定义一起,不然无法构成内联函数
    }

定义在类声明之中的成员函数将自动地成为内联函数

复制代码
    class A
    {
    public:
        void FOO(int x, int y)
    {
        ///自动地成为内联函数
    }
    }

调用函数的过程:在调用之前需要先保存好寄存器,并在程序返回时恢复原来的状态。同时将实际参数复制到位,并转而执行一个新的指令位置。这会导致一定的开销。

引入内联函数的主要目标是为了解决程序中函数调用效率的问题。简单来说就是说,在编译器编译程序的时候会将程序中出现的那些内联函数的调用表达式替换成该相应内联函数的具体实现代码。而其他非内联功能则是在运行时才被替代进去。其实这本质上是通过空间代价换取时间效率的一种权衡策略。因此通常情况下 内联功能代码长度会在1到5行之间

  • 在一个类中所定义的任何内部函数都是内联函数。
  • 定义一个内联函数应在它首次被调用之前完成。
  • 在一个类中所定义的任何内部函数都是该类说明范围内的自动执行功能。
8、函数重载(略简单,应在后期有补充)

参数表不相同的多个函数可以拥有相同的函数名称

复制代码
    void display_message(char ch);
    void display_message(const string&);
    void display_message(const string&, int);
    void display_message(const string&, int, int);
9、模板函数(后期应有补充)

函数模板可用于将单一函数的内容与期望显示的不同种类的vector型别进行整合

该文档中定义了function template(函数模板),其格式由关键词