C++远征之起航篇
与C相比:
- 新的数据类型:bool
- 新的初始化方法:
int x (1024);
速度上的优势 - 随用随定义的变量
- 命名空间namespace
C++远征之离港篇
- 引用
- const的用法
- 函数默认值
- 函数重载
- 内联函数
- 内存管理
下面记录一下我的想法:
- 引用:
引用在定义时就必须初始化。
而指针不必这样,那可不可以把引用做的事理解成一个指针常量(int * const p)做的事?只不过引用存的是内容,指针存的是地址?
使用gdb调试一下:
int a = 1;
int &b = a;
看结果发现:
b的地址和a的地址是相同的,这样看来,称b为a的一个别名也不无道理
控制变化的const
需要注意的是:
const int *x = 10;
int *y = &x;
/*error: invalid conversion from 'const int*' to 'int*' [-fpermissive]*/
int *x = 10;
const int *y = &x;
/*当然这样是可以的*/
函数默认值
函数默认值加在函数声明部分,好于加在函数定义部分,后者部分编译器会报错。
带默认值的参数必须列于参数列表尾部:
int getMax(int i, int j = 10, int k = 20);
int getMax(int i = 1, int j, int k = 2);//error!
函数重载
函数名相同,函数参数的个数或类型不同。
内联函数
内联函数的调用省去了 2、4两步,节省时间提高效率。我们使用inline建议编译器使用这种方法,实际编译器得到建议后会自行判断(逻辑简单,不带有for,while循环)是否作为内联函数编译。
内存管理
C++新增了一对儿 运算符:
new
delete
int *arr = new int[10];
if(NULL == arr)//判断是否申请成功
{
//内存分配失败
//异常处理
}
//TODO
delete []arr; //释放块内存
/*通过gdb调试发现:
delete操作似乎只是把相应内存空间进行初始化,
通过指针仍能对相应内存进行读写操作,编译器不会报错*/
arr = NULL; //鉴于以上,为了程序的健壮性考虑,要对指针置空
C++远征之封装篇(上)
类的实例化与对象的访问:
class Student
{
public:
int data;
int fun();
//TODO
};
int main()
{
//从栈实例化一个(组)对象:
Student stu;
Student stu[20];
//访问:
stu.data = 0;
stu.fun();
//从堆实例化一个(组)对象:
Student *p = new Student();
Student *p = new Student[20];
//访问
p->data = 1;
p->fun();
}
- string 类型:
初始化string对象的方式 | |
---|---|
string s1; | s1为空串 |
string s2(“ABC”) | 用字符串字面值初始化s2 |
string s3(s2); | 用s2初始化s3 |
string s4(n, ‘c’) | 用n个连续的字符 ‘c’初始化s4 |
string类型方法 |
---|
s.empty() |
s.size() |
s[n] |
s1 + s2 |
s1 = s2 |
s1 == s2 |
s1 != s2 |
数据的封装
数据对对象外部是不可见的,只能用对象中提供的方法对数据进行修改,使用这种方法能使程序更简洁、方便、安全。
类内定义和内联函数
class A
{
public:
//类内定义的函数优先编译为内联函数
void fun()
{
//TODO
}
};
- 分文件类外定义
//CLASS_NAME.h
class A
{
public:
void fun();
};
//CLASS_NAME.cpp
A::fun()
{
//TODO
}
- 构造函数 && 拷贝构造函数 && 初始化列表
class Student
{
public:
//无参构造函数
Student():m_strName("Mike"){}
//有参构造函数,构造函数可以重载
//初始化列表可以初始化const类型和引用类型
Student(string name):PI(3.14)
{
m_strName = name;
}
//拷贝构造函数, 参数只能是一个引用类型,不可以重载
Student(const Student &stu)
{
//TODO
}
//析构函数
~Student()
{
/* 如果在构造函数体中申请堆内存空间(new)
* 就要在析构函数中释放内存空间(delete)
*/
}
private:
string m_strName;
const float PI;
};
初始化列表
无参数构造函数称为默认构造函数
无参数或每个参数都带默认值的构造函数称为默认构造函数只有默认构造函数可以使用初始化列表- 初始化列表先于构造函数体执行
- 初始化列表执行速度快,效率高(对自定义数据类型)
拷贝构造函数
- 直接初始化对象时调用拷贝构造函数
Student s2 = s1
- 复制初始化对象时调用拷贝构造函数
Student s2(s1)
- 函数传参时调用拷贝构造函数:
- 直接初始化对象时调用拷贝构造函数
void fun(Student s)
{
//TODO
}
fun(s1);//调用拷贝构造函数
- 析构函数
- 析构函数在对象销毁时自动调用
- 析构函数无参数、无返回值、不能重载