关于C++信息封装的思考

这几天看书,颇有些收获。

在C++中,信息的隐藏和封装似乎有些问题,比如我在一个静态连接裤/动态链接库中定义了我的一个类,但是我又不想把我的任何的实现细节提供给用户,这个时候该怎么做呢?

我所能想到的办法,似乎就是把头文件中的private和pritected声明的函数和变量全都删除掉。

于是便自己写了几个东西测试下:

类的头文件:myclass.h

#ifndef MYCLASS_H
#define MYCLASS_H


class myclass
{
    public:
        myclass();
        virtual ~myclass();
        void showI();
    protected:
    private:
    int i;
    void iplus();
};

#endif // MYCLASS_H
类的实现:

myclass.cpp

#include "../include/myclass.h"
#include <iostream>
myclass::myclass()
{
    i=1;
    //ctor
}

myclass::~myclass()
{
    //dtor
}

void myclass::showI()
{
    iplus();
    std::cout<<i<<std::endl;
}

void myclass::iplus()
{
    i+=5;
}

把myclass类编译下,然后制作为.a的静态库。

main函数所在文件:main.cpp

#include <iostream>
#include "myclass.h"

using namespace std;
void prt(myclass s)
{
    std::cout<<"prt is running!"<<endl;
    s.showI();
}
int main()
{
    cout << "Hello world!" << endl;
    myclass ms;
    cout<<"Main is Running!"<<endl;
    ms.showI();
    prt(ms);
    return 0;
}

把myclass.h复制到main.cpp所在的目录,然后运行上述程序,输出的结果

Hello world!
Main is Running!

6

prt is running!

11

运行结果正常,下面我们把main.cpp下的myclass.h修改下,注释掉其中的private和protected部分

#ifndef MYCLASS_H
#define MYCLASS_H


class myclass
{
    public:
        myclass();
        virtual ~myclass();
        void showI();
    //protected:
    //private:
    //int i;
    //void iplus();
};

#endif // MYCLASS_H
再次运行,结果就不一样了:

Hello world!
Main is Running!

6

prt is running!

134515917


这是怎么回事?同样的静态库,我只是把引用的头文件去掉了private和protected而已,结果运行竟然不正确!

这是多么令人纠结的问题?

根据这几天看书的心得,main.cpp引用的myclass.h相当于一个不完整声明,编译器需要根据这个生命来确定要为myclass分配的内存大小,所以如果对类的生命不完整,那么传递参数类型为这个类的对象的时候,就会出现一些问题了!当然,这里如果换成是myclass *参数的话,运行基本正常,但是要注意,由于myclass的声明不完全,这个时候如果想要声明这个myclass的对象的复制,也会出为题的!对象中的i不会被复制!

myclass t2(ms);这样的t2中的i是不等于ms中的i的!很显然编译器无法知道默认的复制构造函数是什么!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值