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) |