本文重点关注与c语言不同的地方
hello,world
1 | #include <iostream> |
linux下使用g++编译
1 | g++ helloworld.cpp |
基本语法
枚举
1 | #include <iostream> |
常量
使用#define或者const定义常量
1 | #define LENGTH 10 |
static,extern,thread_local
static
* 修饰全局变量时,表示可见性仅在本文件内
* 修饰局部变量时,函数返回后不会销毁变量
* 修饰类成员时,仅有一个成员副本被所有类对象共享
extern
* 当有两个或多个文件共享相同的全局变量或者函数
thread_local
* 声明的变量仅可在它在其上创建的线程上访问
string
c++标准库中提供了string类型
1 | string str1 = "Hello"; |
函数
函数参数可以赋默认值
引用
1 | int& r = i; |
函数参数可以是引用,返回值也可以是引用.当参数是引用时函数中的修改会变更引用对象的值,当返回值是引用时实际返回的是一个指向返回值的隐式指针,因此可以放在左边赋值
输入输出流
cout,cin,cerr,clog
cout<<”hello,world”
cin>>name
面向对象
构造函数
使用初始化列表来初始化字段
1 | Line::Line( double len): length(len) |
其中length是类中的一个成员变量
冒号后边也可以是一个父类的构造函数
析构函数
1 | ~Line(); |
拷贝构造函数
1 | classname (const classname &obj) { |
拷贝构造函数在三种情况下会被调用
- 一个对象以值传递方式传入函数
- 一个对象以值传递的方式从函数返回
- 一个对象需要通过另外一个对象进行初始化
继承
1 | class derived-class: access-specifier base-class |
access-specifier可以为public,protected,private,修饰符会对基类中的成员在派生类的可访问性做出不同处理
1 | class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,… |
多继承
重载
同一作用域内,可以重载函数和操作符
函数有相同的名称但是有不同的参数列表,编译器进行重载决策
1 | #include <iostream> |
赋值运算符重载
1 | #include <iostream> |
输出如下:
1 | First Distance : F: 11 I:10 |
纯虚函数
1 | class Shape { |
= 0 告诉编译器,函数没有主体,上面的虚函数是纯虚函数。
其他
模板
函数模板:
1 | template <class type> ret-type func-name(parameter list) |
示例:
1 |
|
类模板:
1 | template <class type> class class-name { |
示例:
1 | #include <iostream> |