gpt4 book ai didi

c++ - Const 和非常量 C++ 构造函数

转载 作者:太空狗 更新时间:2023-10-29 21:43:16 25 4
gpt4 key购买 nike

在 C++03(或更早版本)中是否有一种方法可以编写一个可以存储 const 或非 const 指针并适当处理访问的类?以非功能性“SometimesConst”类的用法为例:

class SometimesConst
{
public:
SometimesConst(int * buffer) : buffer(buffer) {} // Needs const qualifier?

int* get() { return buffer; } // Needs const qualifier?

void increment() { counter++; }

private:
int * buffer; // Needs const qualifier?
int counter;
};

void function(int * n, const int * c)
{
// These are both okay
SometimesConst wn(n);
SometimesConst wc(c);

// Reading the value is always allowed
printf("%d %d", wn.get()[0], wc.get()[0]);

// Can increment either object's counter
wn.increment();
wc.increment();

// Can set non-const pointer
wn.get()[0] = 5;

// Should generate a compiler error
wc.get()[0] = 5;
}

创建常量 SometimesConst 不允许修改对象的计数器属性。是否可以设计一个对输入对象具有编译时常量安全性的类,前提是它们作为常量传入?

最佳答案

不,不是您想要的使用方式。在编译时具有不同行为的唯一方法是具有不同的类型。但是,您可以使其相当易于使用:

#include <stdio.h>

template <typename T>
class SometimesConst
{
public:
SometimesConst(T* buffer) : buffer(buffer) { }
T* get() { return buffer; }
void increment() { ++counter; }
private:
T *buffer;
int counter;
};

typedef SometimesConst<const int> IsConst;
typedef SometimesConst<int> IsNotConst;

void function(int * n, const int * c)
{
IsNotConst wn(n);
IsConst wc(c);

// Reading the value is always allowed
printf("%d %d", wn.get()[0], wc.get()[0]);

// Can increment either object's counter
wn.increment();
wc.increment();

// Can set non-const pointer
wn.get()[0] = 5;

// Should generate a compiler error
wc.get()[0] = 5;
}

关于c++ - Const 和非常量 C++ 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23313649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com