参考资料:C++ Primer 中文版(第5版)——[美] Stanley B. Lippman [美] Josée Lajoie [美] Barbara E. Moo 著 王刚 杨巨峰 译
编译器:Mingw-w64 v8.1.0 中的g++
代码编辑器:VS Code
1. 编译与链接源文件的方法简介
在命令行窗口中切换到要编译的文件所在目录,假如一个应用程序由三个源文件组成,分别是file1.cpp , file2.cpp , file3.cpp ,那么请按照下面的步骤进行:
g++ -c .\file1.cpp
g++ -c .\file2.cpp
g++ -c .\file3.cpp
. 代表当前文件夹,所以.\file1.cpp 就表示当前文件夹中的file1.cpp 文件(其实通常情况下.\ 是可以省略的)。
上面三个命令行执行完毕,当前文件夹中会多出来三个文件,分别是file1.o , file2.o , file3.o ,这三个文件都是经过编译器编译后的二进制文件。下面我们将这三个文件进行链接,执行下面的命令即可(假定我们要生成的应用程序名字是my_app ):
g++ .\file1.o .\file2.o .\file3.o -o my_app
这个命令执行完毕,当前文件夹会多出来一个名为my_app.exe 的文件,这是一个应用程序。至此,编译和链接的操作就完成了。
2. 初识输入输出
C++依靠一个全面的标准库实现输入输出(IO)。最常用的是iostream 库。iostream 库包含两个基础类型istream 和ostream ,分别表示输入流和输出流。一个流就是一个字符序列,它表达的意思是,随着时间的推移,字符顺序生成或消耗。
2.1 四个标准输入输出对象
cin :istream 类型的对象,被称为标准输入cout :ostream 类型的对象,被称为标注输出cerr :ostream 类型的对象,被称为标准错误clog :ostream 类型的对象,用来输出程序运行时的一般性信息。
系统通常将程序所运行的窗口与这些对象关联起来,所以标准输入就是从程序当前运行的窗口读入,标准输出和标准错误会在程序当前运行的窗口输出。
2.2 向流写入数据
这里我们将用到输出运算符(<<)。例子如下:
//hello.cpp
#include<iostream>
int main(){
std::cout << "Hello, world!" << std::endl;
//上面这条语句等价于下面这两条:
//std::cout << "Hello, world!";
//std::cout << std::endl;
return 0;
//输出结果如下:
//Hello, world!
//
}
cout 和endl 前面的std:: 指出这两个名字是定义在名为std 的命名空间(namespace)中的。
endl 是一个被称为操纵符的特殊值,写入endl 的效果是结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流。
2.3 使用标准库中的名字
上面以及提到命名空间(namespace)这个词了。命名空间可以把帮助我们避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突。
标准库定义的所有名字都在命名空间std 中。
:: 被称为作用域运算符,我们通过它来指出我们想使用在命名空间std 中的名字,比如cout 。
2.4 从流读取数据
这里我们将用到输入运算符(>>)。例子如下:
//get_name.cpp
#include<iostream>
#include<string>
int main(){
std::cout << "Please input your first name and last name:" << std::endl;
std::string first_name, last_name;
std::cin >> first_name;
std::cin >> last_name;
//上面两条语句等价于下面的一条语句:
//std::cin >> first_name >> last_name;
std::cout << "I know your name! Your name is " << first_name << " " << last_name << << "!" << std::endl;
return 0;
//输入:Brouce Lee
//输出:I know your name! Your name is Brouce Lee!
}
说明:cin 读取字符串到string 对象,遇到空格便会停止这个对象的读取,所以上面的代码中,变量first_name 的值为Brouce ,变量last_name 的值为Lee 。
3. 注释简介
C++的注释和C的注释一样,都有两种:
- 单行注释:
// 后面都是注释 - 界定符对注释:
/* 和*/ 中间是注释
注意:注释界定符不能嵌套!
4. 控制流
控制流语句允许程序以更复杂的路径执行。
4.1 循环语句
循环语句最常见的有三种:for ,while ,do-while ,三种可互换,但特定情况下可选择更优越的循环语句。
下面我们以求0~100的和为例,用三种不同的循环语句进行编写。
4.1.1 for 循环
#include<iostream>
int main(){
int N = 100, result = 0;//result存储最终结果,初始化为0
for(int i=1; i <= N; i++){
result += i;
}
std::cout << "The sum from 0 to 100 is " << result << "." << std::endl;
return 0;
//输出结果:The sum from 0 to 100 is 5050.
}
for 循环一般比较简洁,适于解决数组相关的问题,但它处理数量不定的数据不如后面两种简洁。
4.1.2 while 循环
#include<iostream>
int main(){
int N = 100, result = 0;//result存储最终结果,初始化为0
int i = 1;//计数器
while(i <= N){
result += i;
i++;
}
std::cout << "The sum from 0 to 100 is " << result << "." << std::endl;
return 0;
//输出结果:The sum from 0 to 100 is 5050.
}
while 循环一般适用于处理数量不定的数据,比如我们要读取数量不定的输入数据就可以使用while 循环,比较方便。
4.1.3 do-while 循环
#include<iostream>
int main(){
int N = 100, result = 0;//result存储最终结果,初始化为0
int i = 1;//计数器
do{
result += i;
i++;
}while(i <= N);
std::cout << "The sum from 0 to 100 is " << result << "." << std::endl;
return 0;
//输出结果:The sum from 0 to 100 is 5050.
}
do-while 循环和while 循环没什么太大的区别,只是判断在前还是在后的问题。
4.2 判断语句
判断语句最常见的有两种:if-else 和switch 语句。和C语言中的用法相同,不再赘述。
5. 类简介
5.1 什么是类?
由于笔者学过Python里面的类,所以对类有了一定的认识。在笔者看来,类就是现实世界的模拟。现实世界中的万物可以被分成若干个类,每个类都有一定的特性和固有行为,把这给体现到代码层面,就是类的属性和成员函数。所以,一个类定义了一个类型,以及与其关联的一组操作。
5.2 类的一个简单的例子
类一般定义在头文件中,比如我们有一个类为dog ,我们把它定义在dog.h 中,然后在my_dog.cpp 中使用这个类。
//dog.h
class Dog{
public:
Dog(int age, std::string breed);//构造函数,创建实例时需要传入参数
void roll();//打滚儿
void age();//输出年龄
void breed();//输出品种
private:
int age;//年龄
std::string breed;//品种
}
上面public中的函数都是在外部实现的(在名为dog.cpp 中实现,此文件略去),这是一个好的习惯,原因此处不提。
下面使用这个类。
//my_dog.cpp
#include"dog.h"
int main(){
my_dog = Dog(2, "Chihuahua");
my_dog.roll();//打滚儿
my_dog.age();//输出年龄
my_dog.breed();//输出品种
return 0;
}
运行这个文件便可看到在dog.cpp 中定义的相应的输出。
C++【开始】到这里就结束了,我们已经引入了C++的核心内容——类,这是面向对象编程的重要内容。后面会更深入地了解它和使用它。
下篇文章预告:C++【C++基础】——变量和基本类型
|