目录

1.CPP Primer 开始


开始

1 C++语言特性

C++同时支持 4 种不同的编程风格:C 风格、基于对象、面向对象、泛型

C++的抽象存在若干缺陷,缺少自动内存管理,缺少对象级别的消息发送机制

建议逐渐从 C++98 转换到 c++11,因为 11 增强了语言机制和标准库

核心设计哲学 Zero Overhead

我觉得 C++中最重要的语法特征应该就是类,C++语言主要的一个设计目标就是让程序员自定义的数据类型(类)像内置类型一样好用。

2 建议

从一开始养成好的习惯,而不是获得很复杂的知识后再去忘掉坏习惯

练习练习练习,edit-compile-debug,不断循环这个周期

3 编写一个简单的 C++程序

  • 引入标准库的头文件使用 <>

  • 引用非标准库的头文件使用 " "

  • 每个 C++程序都包含一个或多个函数(function)

    • 其中一个必须命名为 main
  • 一个函数的定义包括:

    • 返回类型 (return type)
    • 函数名(function name)
    • 参数列表(parameter list, 允许为空)
    • 函数体(function body)
int main()
{
  return 0;
}

3.1 源文件命名约定

.cc/.cxx/.cpp/.cp/.c

3.2 编译和运行程序

  • 计算机不能直接理解和运行 C++源程序
    • 需要把人类读写的字符的排列变为计算机能理解的比特的排列
  • 对源程序进行编译、链接,形成可执行文件

3.3 熟悉编译器

g++

  • 编译:g++ --std=c++11 ch01.cpp -o main
  • 运行:./prog1
  • 查看运行状态:echo $?
  • 编译多个文件:g++ ch2.cpp Sales_item.cc -o main

输入 g++ --help,查看编译器选项:

Usage: g++ [options] file...
Options:
  -pass-exit-codes         Exit with highest error code from a phase
  --help                   Display this information
  --target-help            Display target specific command line options
  --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]
                           Display specific types of command line options
  (Use '-v --help' to display command line options of sub-processes)
  --version                Display compiler version information
  -dumpspecs               Display all of the built in spec strings
  -dumpversion             Display the version of the compiler
  -dumpmachine             Display the compiler's target processor
  -print-search-dirs       Display the directories in the compiler's search path
  -print-libgcc-file-name  Display the name of the compiler's companion library
  -print-file-name=<lib>   Display the full path to library <lib>
  -print-prog-name=<prog>  Display the full path to compiler component <prog>
  -print-multiarch         Display the target's normalized GNU triplet, used as
                           a component in the library path
  -print-multi-directory   Display the root directory for versions of libgcc
  -print-multi-lib         Display the mapping between command line options and
                           multiple library search directories
  -print-multi-os-directory Display the relative path to OS libraries
  -print-sysroot           Display the target libraries directory
  -print-sysroot-headers-suffix Display the sysroot suffix used to find headers
  -Wa,<options>            Pass comma-separated <options> on to the assembler
  -Wp,<options>            Pass comma-separated <options> on to the preprocessor
  -Wl,<options>            Pass comma-separated <options> on to the linker
  -Xassembler <arg>        Pass <arg> on to the assembler
  -Xpreprocessor <arg>     Pass <arg> on to the preprocessor
  -Xlinker <arg>           Pass <arg> on to the linker
  -save-temps              Do not delete intermediate files
  -save-temps=<arg>        Do not delete intermediate files
  -no-canonical-prefixes   Do not canonicalize paths when building relative
                           prefixes to other gcc components
  -pipe                    Use pipes rather than intermediate files
  -time                    Time the execution of each subprocess
  -specs=<file>            Override built-in specs with the contents of <file>
  -std=<standard>          Assume that the input sources are for <standard>
  --sysroot=<directory>    Use <directory> as the root directory for headers
                           and libraries
  -B <directory>           Add <directory> to the compiler's search paths
  -v                       Display the programs invoked by the compiler
  -###                     Like -v but options quoted and commands not executed
  -E                       Preprocess only; do not compile, assemble or link
  -S                       Compile only; do not assemble or link
  -c                       Compile and assemble, but do not link
  -o <file>                Place the output into <file>
  -pie                     Create a position independent executable
  -shared                  Create a shared library
  -x <language>            Specify the language of the following input files
                           Permissible languages include: c c++ assembler none
                           'none' means revert to the default behavior of
                           guessing the language based on the file's extension

输入 g++ -v --help可以看到更完整的指令。 例如还有些常用的:

-h FILENAME, -soname FILENAME: Set internal name of shared library
-I PROGRAM, --dynamic-linker PROGRAM: Set PROGRAM as the dynamic linker to use
-l LIBNAME, --library LIBNAME: Search for library LIBNAME
-L DIRECTORY, --library-path DIRECTORY: Add DIRECTORY to library search path

获得程序状态:

  • windows: echo %ERRORLEVEL%
  • UNIX: echo $?

4 初识输入输出

4.1 IO

iostream 库包含两个基础类型 istream 和 ostream

  • stream(流):一个流就是一个字符序列,是从 IO 设备流出或写入 IO 设备的,“stream"主要表达的是,随着时间的推移,字符是顺序生成或消耗的。
  • istream: input stream,输入流
  • ostream: output stream,输出流

4.2 标准库定义了 4 个 io 对象

  • cin: istream 类型的对象,标准输入 (standard input)
  • cout: ostream 类型的对象,标准输出 (standard output)
  • cerr: ostream 类型的对象,标准错误(standard error)
  • clog: ostream 类型的对象,用来输出程序运行时的一般信息
# include <iostream>
using namespace std;
int main()
{
    cout<<"hello world"<<endl;
    int i;
    cin>>i;
    cout<<i<<endl;

    return 0;
}
  • #include <iostream>
  • std::cout << "hello"
  • std::cin >> v1

记住>><<返回的结果都是左操作数,也就是输入流和输出流本身。

endl:这是一个被称为操纵符(manipulator)的特殊值,效果是结束当前行,并将设备关联的缓冲区(buffer)中的内容刷到设备中。

头文件:类的类型一般存储在头文件中,标准库的头文件使用<>,非标准库的头文件使用""。申明写在.h文件,定义实现写在.cpp文件。

避免多次包含同一头文件

# ifndef SALESITEM_H
# define SALESITEM_H
// Definition of Sales_itemclass and related functions goes here
# endif

成员函数(类方法):使用.调用。

命名空间(namespace):使用作用域运算符::调用。

5 注释简介

注释(comments)可以帮助读者理解程序。 C++中有两种注释:

  • 单行注释
  • 多行注释
    • 不能嵌套
// 单行注释
/*
 * 多行注释格式
 * 每一行加一个*
 */

6 控制流

6.1 程序执行流程

  • 语句一般是顺序执行的
  • 但也提供多种不同的控制流语句

6.2 while 语句

反复执行一段代码,直至给定条件(condition)为假。

# include <iostream>

int main()
{
    int sum = 0, val = 1;
    // keep executing the while as long as val is less than or equal to 10
    while (val <= 10) {
        sum += val;  // assigns sum + val to sum
        ++val;       // add 1 to val
    }
    std::cout << "Sum of 1 to 10 inclusive is "
              << sum << std::endl;

    return 0;
}

7 for 语句

  • 在循环条件中检测变量,在循环体中递增变量的模式使用非常频繁
    • 以至于 c++专门定义了这样一种循环
  • for 语句的出现就是为了筒化这一流程
    • 初始化语句(init-statement)
    • 循环条件(condition)
    • 循环体(body)
    • 表达式(expression)
# include <iostream>

int main()
{
    int sum = 0;

    // sum values from 1 through 10 inclusive
    for (int val = 1; val <= 10; ++val)
        sum += val;  // equivalent to sum = sum + val
    std::cout << "Sum of 1 to 10 inclusive is "
              << sum << std::endl;
    return 0;
}

8 对用户输入的数组求和:读取数最不定的输入数据

# include <iostream>

int main()
{
    int sum = 0, value = 0;

    // read until end-of-file, calculating a running total of all values read
    // 当读取到 end of file ,istream 对象的状态会变为无效,处于无效的 istream
    // 对象会使得条件变为假
    while (std::cin >> value)
        sum += value; // equivalent to sum = sum + value

    std::cout << "Sum is: " << sum << std::endl;
    return 0;
}

UNIX 和 Mac 下键盘输入文件结束符:ctrl+d,Windows 下:ctrl+z

9 if 语句

我们可以利用计语句写一个程序,用来统计输入中每个值连续出现了几次


# include <iostream>

int main()
{
    // currVal is the number we're counting; we'll read new values into val
    int currVal = 0, val = 0;

    // read first number and ensure that we have data to process
    if (std::cin >> currVal)
    {
        int cnt = 1; // store the count for the current value we're processing
        while (std::cin >> val)
        {                       // read the remaining numbers
            if (val == currVal) // if the values are the same
                ++cnt;          // add 1 to cnt
            else
            { // otherwise, print the count for the previous value
                std::cout << currVal << " occurs " << cnt << " times"
                          << std::endl;
                currVal = val; // remember the new value
                cnt = 1;       // reset the counter
            }
        } // while loop ends here
        // remember to print the count for the last value in the file
        std::cout << currVal << " occurs " << cnt << " times" << std::endl;
    } // outermost if statement ends here
    return 0;
}

再谈编译:C++是静态类型语言,编辑-编译-调试(edit-compile-debug)是一个周期,编译时,编译器会检测一些错误,常见的错误类型是语法错误类型错误声明错误

10 类简介

10.1 抽象和具体

  • 抽象
  • 具体
    • 类的实例

10.2 类的简介

  • C++中我们通过类(class)来定义自己的数据结构。

    • 建议大型程序将类定义在头文件中
  • 一个类定义了一个类型,以及与其相关联的一组操作,其类型名就是类名。

int i;           //基本数据类型
Sale_item item;  // 自定义类类型

10.3 成员函数

成员函数是定义为类的一部分的函数,有时也被称为方法。

如何指定使用 c++11 进行编译

g++ --std=c++11 ch01.cpp -o main

如何使用文件重定向

./main < data/add_item

11 书店程序

Cpp_Primer_Practice-master

目前,主要的知识点是能够编译、运行简单的 c++ 程序,如何定义变量,如何进行输入输出,如何编写 if、for、while 语句。我们还介绍了类,对于别人定义的类,我们如何创建、使用其对象,后续我们将定义自己的类。

12 术语表

术语 解释 备注、代码展示
参数(实参,argument)
赋值(assignment)
程序块(block)
缓冲区(buffer)
内置类型(built-in type)
cerr
cin
cout
clog
字符串字面值常量(character string literal)
类(class)
类类型(class type)
注释(comment)
条件(condition)
花括号(curly brace)
数据结构(data structure)
编辑-编译-调试(edit-compile-debug)
文件结束符(end-of-file)
表达式(expression)
for 语句(for statement)
函数(function)
函数体(function body)
函数名(function name)
头文件(header)
if 语句(if statement)
初始化(initialize)
库类型(library type)
操作符(manipulator)
成员函数(member function)
方法(method)
命名空间(namespace)
形参列表(parameter list)
返回类型(return type)
源文件(source file)
标准错误(standard error)
标准输入(standard input)
标准库(standard libraly)
标准输出(standard output)
语句(statement)
字符串常量(string literal)
while 语句(while statement)
()运算符(()operation)
++运算符(++ operatior)
+=运算符 (+= operator)
.运算符 (. operator)
::运算符 (:: operator)
=运算符(= operator)
–运算符 (–operator)
«运算符 («operator)
运算符 (–operator)
==运算符 (==operator)
!=运算符 (!=operator)
<=运算符 (<=operator)
=运算符 (>=operator)
<运算符 (<operator)
>运算符 (>operator)