C++ 指针和const的讨论

 

该博客主要关于指针的相关信息,包含普通指针和共享指针以及const的讨论

#include <iostream>
#include <memory>

using namespace std;

// 对于普通类型指针
#define PTR(X)       X*                // 普通指针
#define CONST_PTR(X) const X*          // 指针内容不可修改
#define PTR_CONST(X) X* const          //  指针不可修改
#define CONST_PTR_CONST(X) const X* const // 指针和指针内容不可修改

// Ptr: 普通共享指针
// ConstPtr: 不可修改内容的共享指针
// PtrConst: 不可修改指针的共享指针,内容可以修改
// ConstPtrConst: 只能初始化的指针,不能做任何的修改动作
#define SHARED_PTR_DEFINE(X) \
    public: \
    typedef std::shared_ptr<X> Ptr;  \
    typedef std::shared_ptr<const X> ConstPtr;  \
    typedef const std::shared_ptr<X> PtrConst; \
    typedef const std::shared_ptr<const X> ConstPtrConst;

class testA
{
    SHARED_PTR_DEFINE(testA)
    public:
        testA()
    {
        a = 10000;
    }

public:
    void print() const
    {
        std::cout << "a = " << a << std::endl;
    }

public:
    int a;
};

#if 0
void print(PTR(testA) p)
{
    p->print();

    p->a = 10;

    p = new testA;

    p->print();
}

void print(CONST_PTR(testA) p)
{
    p->print();

    //    p->a = 10;  // error
}

// error print(PTR(testA) p) 重定义
//void print(PTR_CONST(testA) p)
//{
//    p->print();

//    p->a = 10;

//    p = new testA(); // error
//}

// error print(CONST_PTR(testA) p) 重定义
// void print(CONST_PTR_CONST(testA) p)
// {
//    p->print();
// }

#endif

#if 1
void print(testA::Ptr p)
{
    std::cout << "B: p = " << p.use_count()
              << ", p address = " << (unsigned long long int)(&p)
              << ", p pointer address = " << (unsigned long long int)(p.get()) << std::endl;

    std::cout << "run here 3" << std::endl;
    p->print();

    p->a = 100;

     p->print();

    p.reset(new testA);

    p->print();

    std::cout << "C: p = " << p.use_count()
              << ", p address = " << (unsigned long long int)(&p)
              << ", p pointer address = " << (unsigned long long int)(p.get()) << std::endl;
}

// 共享指针对象是传值,但是,对于指针的修改同样有效
void print(testA::ConstPtr p)
{
    std::cout << "run here 2" << std::endl;
    p->print();

    // p->a = 1; // error

    p.reset(new testA);

    p->print();
}

// error: print(test::Ptr p) 重定义
//void print(testA::PtrConst p)
//{
//    p->print();

//    p->a = 1;

    p.reset(new testA);// error

//    p->print();
//}

//error: print(testA::ConstPtr p) 重定义
//void print(testA::ConstPtrConst p)
//{
//    p->print();

    p->a = 1; // error

    p.reset(new testA); // error
//}

#else
// 共享指针传地址
void print(testA::Ptr& p)
{
    std::cout << "B: p = " << p.use_count()
              << ", p address = " << (unsigned long long int)(&p)
              << ", p pointer address = " << (unsigned long long int)(p.get()) << std::endl;

    std::cout << "run here 3" << std::endl;
    p->print();

    p->a = 1;

    p.reset(new testA);

    p->print();

    std::cout << "C: p = " << p.use_count()
              << ", p address = " << (unsigned long long int)(&p)
              << ", p pointer address = " << (unsigned long long int)(p.get()) << std::endl;
}

void print(testA::ConstPtr& p)
{
    std::cout << "run here 4" << std::endl;
    p->print();

    // p->a = 1; // error

    p.reset(new testA);

    p->print();
}

void print(testA::PtrConst& p)
{
    std::cout << "run here 5" << std::endl;
    p->print();

    p->a = 1;

    //    p.reset(new testA);// error

    p->print();
}

void print(testA::ConstPtrConst& p)
{
    std::cout << "run here 6" << std::endl;
    p->print();

    //    p->a = 1; // error

    //    p.reset(new testA); // error
}
#endif

int main()
{
#if 0
    PTR(testA) p00 = new testA();

    PTR(testA) p0 = new testA();

    p0->print();

    p0 = new testA();

    p0 = p00;

    // 指针内容不可修改

    CONST_PTR(testA) p = new testA(); // p的内容是const
    p->print();

    //    p->a = 2;  // error, 不允许修改指针所指内容

    // 指针不可修改
    PTR_CONST(testA) p1 = new testA(); // p1是const

    p1->a  = 1;

    p1->print();

    //    p = p1; // error, 不允许修改指针

    // 指针和指针内容不可修改
    CONST_PTR_CONST(testA) p2 = new testA();

    p2->print();

    //    p2->a = 1; // error

    //    p2 = p1; // error



#else
    testA::Ptr p(new testA());

    p->a = 2;

    p->print();

    testA::Ptr p1(new testA());

    p = p1;

    p->print();

    // 内容不可以修改的指针
    testA::ConstPtr p2(new testA());

    p2->print();

    //    p2->a = 3; // error,指针所指的内容不可以修改

    p2.reset(new testA());  // 允许修改指针

    p2->print();

    // 指针不可以修改的指针
    testA::PtrConst p3(new testA());

    p3->a = 4;  //

    //    p3.reset(new testA()); // error 不允许修改指针

    // 只能初始化的指针
    testA::ConstPtrConst p4(new testA());

    p4->print();

    //    p4.reset(new testA()); // error 不允许修改指针

    //    p4->a = 5;    // error 不允许修改指针所指的内容

    // 共享指针对象传地址也能够将修改的指针信息返回: 用于验证引用
    std::cout << "A p = " << p.use_count()
              << ", p address = " << (unsigned long long int)(&p)
              << ", p pointer address = " << (unsigned long long int)(p.get()) << std::endl;
    print(p);

    std::cout << "D p = " << p.use_count()
              << ", p address = " << (unsigned long long int)(&p)
              << ", p pointer address = " << (unsigned long long int)(p.get()) << std::endl;
#endif
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值