文章目录
C++基础
第2章 数据的存储、表示形式和基本运算
数据类型
常量
- 数值常量
- 字符常量
- 符号常量(#define size 1000,在预编译阶段被替换)
变量
- 变量的定义
- 变量的初始化
- 常变量(const int a = 100;)
运算符
- 算术运算符
- 逻辑运算符
- 自增和自减运算符
- 强制类型转换运算符,如:(类型名)(表达式)
- 赋值运算符
- 复合运算符,如+=,-=
第3章 程序设计初步
算法的概念
c++程序结构和c++语句
- 声明语句
- 执行语句
- 空语句
- 复合语句
赋值操作
输入、输出
关系运算和逻辑运算
选择结构
- if语句
- switch语句
循环结构
while循环
do-while循环
for循环
提前结束循环
- break
- continue
第4章 函数
定义函数
类型名 函数名(参数列表-可选)
{
声明语句;
执行语句;
}
函数参数和函数的值
- 形式参数和实际参数
- 函数的返回值,return语句
函数的调用
- 一般调用
- 嵌套调用
- 递归调用
内置函数
函数的重载
什么是函数重载(what)?
函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。
例子
#include<iostream>
using namespace std;
int max(int a,int b)
{
return a>=b?a:b;
}
double max(double a,double b)
{
return a>=b?a:b;
}
int main()
{
cout<<"max int is: "<<max(1,3)<<endl;
cout<<"max double is: "<<max(1.2,1.3)<<endl;
return 0;
}
函数模板
定义
函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。
例子
#include <iostream>
using namespace std;
template<class T>
//上句可以改成template<typename T>
void Swap(T & x, T & y)
{
T tmp = x;
x = y;
y = tmp;
}
int main()
{
int n = 1, m = 2;
Swap(n, m); //编译器自动生成 void Swap (int &, int &)函数
double f = 1.2, g = 2.3;
Swap(f, g); //编译器自动生成 void Swap (double &, double &)函数
return 0;
}
有默认参数的函数
略
局部变量和全局变量
略
变量的存储类别
- 自动变量:没有任何关键字加以声明,采用动态地分配存储空间
- 用staitic声明局部静态变量
- 用register声明寄存器变量(对常用的变量可以这样声明,但实际上不用了)
- 用extern声明外部变量
- 用static声明静态外部变量
内部函数和外部函数
内部函数
只能被本文件中其他函数所调用,它称为内部函数(又称静态函数)
例如:static int func(int a, int b);
外部函数
与内部函数相反,可供其他文件调用
例如:extern int func(int a, int b);
头文件
头文件的內容
- 对类型的声明,如:struct、class
- 函数的声明
- 内置(inline)函数的定义
- 宏定义
- 全局变量定义
- 外部变量声明(extern)
第5章 数组
一维数组的定义、引用、初始化
略
二维数组的定义、引用、初始化
略
数组作为函数参数
略
字符数组与字符串变量(string)
略
第6章 指针和引用
变量与指针的关系
变量的指针是变量的地址。用来存放变量地址的变量是指针变量
指针变量
- 定义 : (类型* 指针变量名;)
- 两个有关指针变量的运算符(*指针运算符, &取地址符)
用指针作函数参数
数组与指针
字符串与指针
返回指针的函数
指针数组
指向指针的指针
const指针
指向常量的指针变量
const 类型名* 指针变量名;
常指针
类型名* const 指针变量名;
引用
第7章 用户自定义类型
结构体
枚举类型
第8章 类和对象
类的声明和对象的定义
声明类类型
class 类名
{
private:
私有函数和数据;
public:
公有函数和数据;
//没有public和private的默认为public
}
定义对象
和定义普通变量一样
类的成员函数
定义方法
- 在类外定义
- 在类内定义(相当于内置函数inline)
成员函数的存储方式
略
对象成员的引用
- 对象名.成员名
- 指针变量名->成员名
- 对象引用.成员名
第9章 类和对象的使用
用构造函数(constructor)对类对象初始化
- 带参数的构造函数
- 构造函数的重载
- 带默认参数的构造函数
析构函数
类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。
析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。
构造函数和析构函数的执行顺序
先构造的后析构,后构造的先析构,相当于一个栈
对象数组
略
对象指针
指向对象的指针
Time *p = &t;
指向对象成员的指针
指向对象数据成员的指针
指向对象成员函数的指针
指针定义:函数返回类型名 (类名::*指针变量名)(参数列表);
指针赋值:指针变量名 = &类名::成员函数名;
this指针
略
对象与常const
常对象
- 类名 const 对象名(实参表);
- const 类名 对象名(实参表);
常对象成员
常数据成员
仅能通过构造函数的参数初试化列表对常数据成员进行初始化
例如:Time::Time(int h) : hour(h){}
常函数成员(可以引用数据成员,但不能改变)
类型名 函数名(参数表) const;
例如:void get_time() const;
指向对象的常指针(指针初始化后不能指向别的对象)
类名 *const 指针变量名;
指向常对象的指针
const 类名* 指针变量名;
对象的常引用
const 类名& 引用名 = 对象名;
对象的赋值和复制
- 赋值:对象名1 = 对象名2;
- 赋值:Box box2(box1);
静态成员
- 静态数据成员
- 静态成员函数:主要用于访问类的静态成员
友元(friend)
友元函数
- 将普通函数声明为友元函数(在类的public部分声明),使得这个函数可以访问类对象的私有成员
- 友元成员函数,就是将别的类的成员函数声明为另一个类的友元函数
友元类(单向的)
使得一个类可以访问另一个类的私有成员
类模板
略
第10章 运算符重载
运算符的重载
略
不同类型数据间的转换
标准类型数据间的转换
用转换构造函数进行不同数据类型的转换
类型转换函数:
在类内定义,如:operator double(){return real;}
第11章 继承与派生
声明派生类
class 派生类名: [继承方式] 基类名
{
派生类新增的成员;
}
//继承方式:public、private、protected,没有声明继承方式,默认为private
派生类的构成
- 从基类接收的成员
- 调整从基类接收的成员
- 派生类自身新增的成员
派生类成员的访问属性
类的三种成员类型
三种继承方式
当public继承的时候,父类中public类型的成员会被继承到子类的public中去,而父类的protected成员也会被继承到子类的protected中去
当protected继承的时候,父类中无论是public的还是protected的成员都会被继承到子类的protected中去
当private继承的时候,父类中 public 和 protected 的成员都会被继承到子类的private中去
注意:父类的private成员是无论如何都不能被继承的。
派生类的构造函数和析构函数
简单的派生类构造函数
派生类构造函数名(总参数列表) : 基类构造函数名(参数列表) {派生类中新增数据成员初始化语句;}
有子对象的派生类的构造函数(子对象:指类的数据成员中有另外的类对象)
派生类构造函数名(总参数列表) : 基类构造函数名(参数列表), 子对象名(参数列表) {派生类中新增数据成员初始化语句;}
析构同上
多重继承
定义
允许一个派生类同时继承多个基类
多重继承派生类的构造函数
派生类构造函数名(总参数列表) : 基类1构造函数名(参数列表),基类2构造函数名(参数列表)
{派生类中新增数据成员初始化语句;}
虚基类
作用
在继承间接共同基类时只保留一份成员
例子:
class A
{....};
class B : virtual public A
{....};
class C : virtual public A
{....};
基类与派生类的转换
可以用子类对象对其基类对象赋值,而不能用基类对象对其子类对象赋值,同一基类的不同派生类对象之间也不能赋值。
第12章 多态性与虚函数
静态多态性
由函数重载和运算符重载形成的多态性属于静态多态性,要求在程序编译时就要知道调用函数的全部信息,因此也称为编译时的多态性。
动态多态性
虚函数
所谓虚函数,就是在基类声明函数是虚拟的,并不是实际存在的函数,然后在派生类中才正式定义此函数。在程序执行期间,用指针指向某一派生类对象,这样就可以调用指针指向的派生类对象中的函数,而不会调用其他派生类的函数。
虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。
关联
确定调用的具体对象的过程称为关联。
- 静态关联:上面的静态多态性
- 动态关联:上面的动态多态性
虚析构函数
避免使用动态多态性时,delete(销毁)派生类对象时,只执行基类的析构函数,不执行派生类的析构函数。
纯虚函数和抽象类
纯虚函数:声明一个基类不需要(定义)的函数,但是派生类都需要的函数
形如:virtual 函数类型名 函数名 (参数列表) = 0;
抽象类:在面向对象程序设计中,往往有一些类,它们不用来生成对象。定义这些类的唯一目的是用它们作为基类去建立派生类。