《C++语言基础》程序阅读——指针、const、static(一)

重要链接 贺利坚老师教学链接

代码阅读:
代码片段一:

#include <iostream>
using namespace std;
class base
{
private:
    int m;
public:
    base() {};
    base(int m){this->m=m;}
    int get(){return m;}
    void set(int m){this->m=m;}
};//base_end 

int main()
{
    base *ptr;
    ptr=new base[2];
    ptr->set(30);
    ptr=ptr+1;
    ptr->set(50);
    base a[2]= {1,9};
    cout<<a[0].get()<<","<<a[1].get()<<endl;
    cout<<ptr->get()<<",";
    ptr=ptr-1;
    cout<<ptr->get()<<endl;
    delete[] ptr;
    return 0;
}

解读main函数:

base *ptr;

只是在栈上开辟一个4字节的空间,用来存放base类型的指针变量ptr

ptr = new base[2];

在堆中开辟base[0]及base[1]两个base类型对象的空间, 并使指针ptr指向base[0]的首地址.同时两个base对象由不带参的默认构造函数生成.

ptr->set(30);

调用 base[0] 的set成员函数,另私有类成员 m = 30

ptr=ptr+1;

另ptr 指向 base[1]对象

ptr->set(50);

调用 base[1] 的set成员函数,另私有类成员 m = 50

//华丽分界线//重点内容

base a[2]= {1,9};

在栈中开辟两个base类型对象a[0],a[1].其中a[0],a[1]调用重载构造函数base(int m){this->m=m;}
对于这句代码。一开始我也很难想象如何将类对象的赋值转换成构造函数的调用的,直到做实验反汇编后才得出结论。推理过程如下:
main中写测试代码

base b = 2;
cout << b.get() <<endl; 
base c(3);
cout <<c.get()<<endl;

显示输出结果是 2 (换行) 3 ,下断,命中断点,查看反汇编代码,发现,对象创建时候调用的构造函数都是同一个构造函数 base(int m){this->m=m;}
于是肯定对类对象直接赋值,会导致调用重载的构造函数。
接下来,对类进行修改

class base
{
public:
    base() {};
    base(int m, int n) { this->m = m; this->n = n; }
    int getm() { return m; }
    int getn() { return n; }
    void set(int m) { this->m = m; }
private:
    int m;
    int n;
};

新增私有成员函数int n ,以及公有函数 int getm() ,int getn()
main中写测试代码:

base b = 2;

提示出错: 不存在从 int 转换为 base 的构造函数
于是修改

base b = {2,3};

华丽丽的错误消失了,又能调用构造函数了。b.getm(),b.getn() 分别输出 2,3
那对于原来的 base a[2] = {1,9} 又要如何改?

base a[2] = {1,2,3,4}; //错误
base a[2] = { {1,2},{3,4}};//正确

OK实验完毕,对于类对象的赋值,需要遵循的规则如上.

//华丽分界线///结束///

cout<<a[0].get()<<","<<a[1].get()<<endl;

调用a[0]对象的get()成员函数,输出1
调用a[1]对象的get()成员函数,输出9

cout<<ptr->get()<<",";

由于ptr指向 base[1] 所以输出 50

ptr=p -1;

另ptr 指回 ptr[0] 对象

cout<<ptr->get()<<endl;

输出 30

delete[] ptr; 

由于 ptr 是在堆上分配,所以使用完要删除,释放内存,否则造成内存泄漏

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值