一页纸 C++ 手册

基于 Learn X in Y minutes (opens new window)进行修改

常见的程序结构

  1. #include <iostream>
  2. // include 是“包含”的意思, 表示引入输入输出流的头文件
  3. // iostream = i + o + stream = input + output + stream = 表示 input-stream 输入流和 output-stream 输出流
  4. using namespace std;
  5. // namespace 命名空间
  6. // std = standard 标准
  7. // C++ 标准程序库中的所有标识符都被定义在一个名为 std 的 namespace 中
  8. int main(){
  9. // 一系列操作
  10. int a; //定义变量
  11. cin>>a; //获取键盘输入, 存入变量
  12. cout<<a; //输出
  13. return 0;
  14. }

输入 & 输出

  1. // C++使用"流"来输入输出. <<是流的插入运算符, >>是流提取运算符
  2. // cin 表示输入
  3. // cout 表示输出
  4. #include <iostream> // 引入包含输入输出流的头文件
  5. using namespace std; // 标准程序库所在的命名空间
  6. int main()
  7. {
  8. int n;
  9. // 在显示器中显示
  10. cout << "输入你最喜欢的数字:\n";
  11. // 获取键盘输入, 存储到 n 变量中
  12. cin >> n;
  13. // cout也提供了格式化功能,即按照你设定的格式输出的功能
  14. cout << "你最喜欢的数字是 " << n << "\n";
  15. }

判断流程

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. int a,b;
  5. cin>>a>>b;
  6. if (a > b) {
  7. cout<<"第一个数大于第二个数";
  8. } else if (a < b){
  9. cout<<"第一个数小于第二个数";
  10. } else {
  11. cout<<"两个数相等";
  12. }
  13. return 0;
  14. }

循环流程

  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. for (int i=1; i<=10; i++){
  5. cout<<i<<endl;
  6. }
  7. return 0;
  8. }

定义函数

  1. #include <iostream>
  2. using namespace std;
  3. // 定义函数
  4. // 注意: 下面函数定义时给参数c设置了默认值
  5. // 默认参数必须放在所有常规参数的后面
  6. int add(int a, int b, int c = 0)
  7. {
  8. return a + b + c;
  9. }
  10. int main()
  11. {
  12. int n1, n2, sum;
  13. cin>>n1>>n2; //获取输入
  14. // 调用函数, 并传入参数
  15. // 注意, 这里没有提供第3个参数, 所以函数会使用定义时的默认值
  16. sum1 = add(n1, n2);
  17. // 注意, 这里提供了第3个参数
  18. sum2 = add(n1, n2, -1);
  19. cout<<"第一个结果是 " + sum1
  20. cout<<"第二个结果是 " + sum2
  21. return 0;
  22. }

字符串拼接

  1. #include <string>
  2. using namespace std; // 字符串也在std命名空间( 标准库 )中
  3. string myString = "Hello";
  4. string myOtherString = " World";
  5. // + 用于连接字符串
  6. cout << myString + myOtherString; // "Hello World"
  7. cout << myString + " You"; // "Hello You"

类 & 对象

  1. #include <iostream>
  2. // 声明一个类
  3. // 类通常在头文件( .h或.hpp )中声明
  4. class Dog {
  5. // 成员变量和成员函数默认情况下是私有( private )的.
  6. std::string name;
  7. int weight;
  8. // 在这个标签之后, 所有声明都是公有( public )的,
  9. // 直到重新指定"private:"( 私有继承 )或"protected:"( 保护继承 )为止
  10. public:
  11. // 默认的构造器
  12. Dog();
  13. // 这里是成员函数声明的一个例子.
  14. // 可以注意到, 我们在此处使用了std::string, 而不是using namespace std
  15. // 语句using namespace绝不应当出现在头文件当中.
  16. void setName(const std::string& dogsName);
  17. void setWeight(int dogsWeight);
  18. // 如果一个函数不对对象的状态进行修改,
  19. // 应当在声明中加上const.
  20. // 这样, 你就可以对一个以常量方式引用的对象执行该操作.
  21. // 同时可以注意到, 当父类的成员函数需要被子类重写时,
  22. // 父类中的函数必须被显式声明为_虚函数( virtual )_.
  23. // 考虑到性能方面的因素, 函数默认情况下不会被声明为虚函数.
  24. virtual void print() const;
  25. // 函数也可以在class body内部定义.
  26. // 这样定义的函数会自动成为内联函数.
  27. void bark() const { std::cout << name << " barks!\n" }
  28. // 除了构造器以外, C++还提供了析构器.
  29. // 当一个对象被删除或者脱离其定义域时, 它的析构函数会被调用.
  30. // 这使得RAII这样的强大范式( 参见下文 )成为可能.
  31. // 为了衍生出子类来, 基类的析构函数必须定义为虚函数.
  32. virtual ~Dog();
  33. }; // 在类的定义之后, 要加一个分号
  34. // 类的成员函数通常在.cpp文件中实现.
  35. void Dog::Dog()
  36. {
  37. std::cout << "A dog has been constructed\n";
  38. }
  39. // 对象( 例如字符串 )应当以引用的形式传递,
  40. // 对于不需要修改的对象, 最好使用常量引用.
  41. void Dog::setName(const std::string& dogsName)
  42. {
  43. name = dogsName;
  44. }
  45. void Dog::setWeight(int dogsWeight)
  46. {
  47. weight = dogsWeight;
  48. }
  49. // 虚函数的virtual关键字只需要在声明时使用, 不需要在定义时重复
  50. void Dog::print() const
  51. {
  52. std::cout << "Dog is " << name << " and weighs " << weight << "kg\n";
  53. }
  54. void Dog::~Dog()
  55. {
  56. std::cout << "Goodbye " << name << "\n";
  57. }
  58. int main() {
  59. Dog myDog; // 此时显示"A dog has been constructed"
  60. myDog.setName("Barkley");
  61. myDog.setWeight(10);
  62. myDog.print(); // 显示"Dog is Barkley and weighs 10 kg"
  63. return 0;
  64. } // 显示"Goodbye Barkley"
  65. // 继承:
  66. // 这个类继承了Dog类中的公有( public )和保护( protected )对象
  67. class OwnedDog : public Dog {
  68. void setOwner(const std::string& dogsOwner)
  69. // 重写OwnedDogs类的print方法.
  70. // 如果你不熟悉子类多态的话, 可以参考这个页面中的概述:
  71. // http://zh.wikipedia.org/wiki/%E5%AD%90%E7%B1%BB%E5%9E%8B
  72. // override关键字是可选的, 它确保你所重写的是基类中的方法.
  73. void print() const override;
  74. private:
  75. std::string owner;
  76. };
  77. // 与此同时, 在对应的.cpp文件里:
  78. void OwnedDog::setOwner(const std::string& dogsOwner)
  79. {
  80. owner = dogsOwner;
  81. }
  82. void OwnedDog::print() const
  83. {
  84. Dog::print(); // 调用基类Dog中的print方法
  85. // "Dog is <name> and weights <weight>"
  86. std::cout << "Dog is owned by " << owner << "\n";
  87. // "Dog is owned by <owner>"
  88. }

异常处理

  1. // 标准库中提供了一些基本的异常类型
  2. // 参见http://en.cppreference.com/w/cpp/error/exception
  3. // 但是, 其他任何类型也可以作为一个异常被拋出
  4. #include <exception>
  5. // 在_try_代码块中拋出的异常可以被随后的_catch_捕获
  6. try {
  7. throw std::exception("A problem occurred");
  8. }
  9. // 如果拋出的异常是一个对象, 可以用常量引用来捕获它
  10. catch (const std::exception& ex)
  11. {
  12. std::cout << ex.what();
  13. // 捕获尚未被_catch_处理的所有错误
  14. } catch (...)
  15. {
  16. std::cout << "Unknown exception caught";
  17. throw; // 重新拋出异常
  18. }