zoukankan      html  css  js  c++  java
  • 第一章 C++编程基础

    第一章 C++编程基础

    1.1 如何撰写C++程序

    赋值 assignment
    复合赋值 (compound assignment) +=

    函数(function)是一块独立的程序代码序列(code sequence),能够执行一些运算,包含4个部分:
    返回值类型(return type)、函数名称、参数列表(parameter list),以及函数体(function body)
    函数的返回值:通常用来返回运算结果 习惯上,令main()返回零,若返回一个非零值,表示程序在执行过程中发生了错误。
    函数的名称:最好能够提供某些信息
    main并非是程序语言定义的关键词,执行C++程序的编译系统,会假设程序中定义有main()函数,如果我们没有定义,程序将无法执行

    1.2 对象的定义与初始化

    类(class),是用户自定的数据类别(user-defined data type)。
    class机制让我们得以将数据类别加入到我们的程序中,并有能力识别它们。
      赋予我们“增加程序内之型别抽象化层次”的能力。
    class的定义:
    头文件中:声明该clss所提供的各种操作行为(operations)
    程序代码文件:包含这些操作行为的实现内容(implementation)

    标准“输入/输出 程序库”:iostream,包含相关的整套classes,用以支持对终端机和文件的输入和输出。

    语句是C++ 程序的最小独立单元。
    声明语句(declaration statement)
    表达式(expression)
    如果没有写return语句,会被自动加上。
    字符常量:可打印字符、不可打印字符

    在自己的应用程序中定义新的class时,也应该为每一个class提供它们自己的output运算符

    所谓命名空间(namespace)是一种将库名称封装起来的方法。通过这种方法,可以有效和应用程序发生命名冲突的问题(所谓命名冲突是指在应用程序内两个不同的实体[entity]具有相同名称,导致程序无法区分两者。命名冲突发生时,程序必须等到该命名冲突获得解析[resolve]之后,才得以继续执行)。命名空间像是在众多名称的可见范围之间竖起的一道道围墙。

    让命名空间中的名称曝光:using namespace std;

    每个对象都属于某个特定的数据类型。对象名称如果设计得好,可以让我们直接联想到该对象的属性。数据类型决定了对象所能持有的数值范围,同时也决定了对象应该占有多少内存空间。

    C++内置的数据类型:布尔值(Boolean)、整数(integer)、浮点数(floating point)、字符(character)。

    int num_tries(0); //构造函数语法(constructor syntax)

    “用assignment运算符(=)进行初始化”这个操作沿袭C语言。如果对象属于内置类型或者对象可以单一值加以初始化,这种方式就没有问题。但如果对象需要多个初值,比如标准库中的复数(complex number)类,这时就需要用构造函数初始化语法(constructor initializat syntax):
    #include <complex>
    complex<double> purei(0, 7);

    当“内置数据类型”与“程序员自行定义的class类型”具备不同的初始化语法时,我们无法编写一个template使它同时支持“内置类型”与“class类型”。

    转义字符(escape sequence)

    1.3 撰写表达式

    条件运算符(conditional operator)
    cout << cnt % line_size ? ' ' : '\n';

    递增(increment) 递减(decrement) 前置(prefix) 后置(postfix)

    任何一种关系运算符(relational operator)的求值结果不是true就是false。
    关系运算符:相等、不等、小于、大于、小于等于、大于等于

    if(user_more == false) 等效于 if(!user_more)

    1.4 条件语句和循环语句

    关于switch-case,为什么要加break:
    一旦有一个case匹配了,就会顺序执行后面的程序代码,而不管后面的其他case是否匹配,直到遇见break或者switch的大括号才结束执行

    为什么不设计成只有匹配case才执行呢,这样就不用break了。这就问Bjarne大大了,但是这样也有利用之处,利用这一特性可以让好几个case执行统一语句

    这种所谓的“向下穿越”的行为模式,可以用下面的例子解释(是否还记得成绩等级判断了):
    switch(num %10 ){
    case 10:
    case 9: cout <<"优秀"; break;
    case 8:
    case 7: cout <<"良好"; break;
    ...
    default : cout <<"不及格";
    }

    1.5如何运用Array和Vector

    Array和Vector
    Array定义:(类型 名字 大小)
    int a[10];
    Vector:(类型 名字 大小)
    vector<int> a(10);
    Vector是class template

    off-by-one错误(差一错误、算错边界、大小差一错误、一位偏移的错误):就是数组或Vector越界错误

    Array初始化:
    a[10]={1,2,3,4,5,6,7,8,9,0};或者不指定大小,让编译器根据初值的数量,自行计算出数组的大小
    Vector初始化:
    定义之后,只能一个一个的初始化a[0] =1; a[1]=2;...a[9]=0;
    或者用已初始化的数组作为该vector的初值:vector<int> a1(a, a+10);
    遍历:for ( vector<string>::iterator iter = text.begin(); iter != text.end(); ++iter )
    另一种遍历是:和Array的一样用下标运算符[]遍历


    1.6 指针带来弹性

    指针为程序引入了一层间接性。

    访问一个由指针所指的对象——提领(dereference)——取得“位于该指针所指向内存地址上”的对象——在指针之前用*号

    任何指针都可以被初始化,或是令其值为0,即是不指向任何对象。
    int *pi =0;
    if( pi && *pi != 1024) ...

    vector<int> *seq_addrs[ seq_cnt ] = {
    &fibonacci, &lucas, &pell,
    ...
    };
    seq_addrs是个array,其元素类型为vector<int> *

    rand()和srand()
    srand(最大值)
    rand_num = rand() %n;

    检查fibonacci vector的第二个元素是否为1 if( !fibonacci.empty() && ( fibonacci[1] == 1 ) )

    . dot成员选择运算符(member selection operator)
    如果使用指针,必须改用arrow成员选择运算符 pv->empty()
    调用empty() 之前,先检验pv是否为非零值 pv && !pv->empty()
    empty() 为空返回1 非空返回0
    如果使用下标运算符(subscript operator),先提领pv,下表运算符的优先级较高, 提领操作要加括号
    if( pv && ! pv->empty() && ( ( *pv )[1] == 1 ) )

    1.7 文件的读写

    #include <fstream> //对文件进行读写操作,头文件
    定义输出文件:ofstream outfile ( "seq_data.txt" );
    定义读取文件:ifstream infile( "seq_data.txt" )
    while( infile >> name ){
    infile >> nt >> nc;
    }

    iofile.seekg(0);

    seekg()可将文件位置重新定位至文件的起始处。

    cerr 代表标准错误输出设个(standard error)。和cout一样,cerr将其输出结果导至用户的终端机。
    cerr的输出节诶过并无缓冲(bufferred)情形——立即显示与用户终端机上。

    操控器(manipulator) endl 插入一个换行符,并清除输出缓冲区(output buffer)的内容。
    其他操控器:hex oct setprecision(n)

    千万别指望有人理解你
  • 相关阅读:
    Java实现 LeetCode 735 行星碰撞(栈)
    Java实现 LeetCode 735 行星碰撞(栈)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)
    Java实现 蓝桥杯算法提高 求最大值
    Java实现 蓝桥杯算法提高 求最大值
    Java实现 蓝桥杯算法提高 求最大值
    Python eval() 函数
    Python repr() 函数
  • 原文地址:https://www.cnblogs.com/Rodge/p/5132712.html
Copyright © 2011-2022 走看看