学习笔记 C++ 封装(上)

C++远征之起航篇

与C相比:

  • 新的数据类型:bool
  • 新的初始化方法:int x (1024);速度上的优势
  • 随用随定义的变量
  • 命名空间namespace

C++远征之离港篇

  • 引用
  • const的用法
  • 函数默认值
  • 函数重载
  • 内联函数
  • 内存管理

下面记录一下我的想法:

  1. 引用:
    引用在定义时就必须初始化。
    而指针不必这样,那可不可以把引用做的事理解成一个指针常量(int * const p)做的事?只不过引用存的是内容,指针存的是地址?
    使用gdb调试一下:
int a = 1;
int &b = a;

gdb...

看结果发现:
b的地址和a的地址是相同的,这样看来,称b为a的一个别名也不无道理

  1. 控制变化的const

    需要注意的是:

const int *x = 10;
int *y = &x;
/*error: invalid conversion from 'const int*' to 'int*' [-fpermissive]*/

int *x = 10;
const int *y = &x;
/*当然这样是可以的*/
  1. 函数默认值

    函数默认值加在函数声明部分,好于加在函数定义部分,后者部分编译器会报错。

    带默认值的参数必须列于参数列表尾部:

int getMax(int i, int j = 10, int k = 20);
int getMax(int i = 1, int j, int k = 2);//error!
  1. 函数重载

    函数名相同,函数参数的个数类型不同。

  2. 内联函数

    这里写图片描述
    内联函数的调用省去了 2、4两步,节省时间提高效率。

    我们使用inline建议编译器使用这种方法,实际编译器得到建议后会自行判断(逻辑简单,不带有for,while循环)是否作为内联函数编译。

  3. 内存管理

    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();
}
  1. 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

  1. 数据的封装

    数据对对象外部是不可见的,只能用对象中提供的方法对数据进行修改,使用这种方法能使程序更简洁、方便、安全。

  2. 类内定义和内联函数

class A
{
public:
    //类内定义的函数优先编译为内联函数
    void fun()
    {
        //TODO
    }
};
  1. 分文件类外定义
//CLASS_NAME.h
class A
{
public:
    void fun();
};
//CLASS_NAME.cpp
A::fun()
{
    //TODO
}
  1. 构造函数 && 拷贝构造函数 && 初始化列表
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;
};
  • 初始化列表

    无参数构造函数称为默认构造函数
    无参数每个参数都带默认值的构造函数称为默认构造函数

    • 只有默认构造函数可以使用初始化列表
    • 初始化列表先于构造函数体执行
    • 初始化列表执行速度快,效率高(对自定义数据类型)

    更多:C++类构造函数初始化列表

  • 拷贝构造函数

    • 直接初始化对象时调用拷贝构造函数Student s2 = s1
    • 复制初始化对象时调用拷贝构造函数Student s2(s1)
    • 函数传参时调用拷贝构造函数:
void fun(Student s)
{
    //TODO
}

fun(s1);//调用拷贝构造函数
  • 析构函数
    • 析构函数在对象销毁时自动调用
    • 析构函数无参数、无返回值、不能重载

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值