Bitiwise Const and pointers:
Bitiwise Const and pointers:
我在Meyers中读到一行:修改指针经常指向的内容的成员函数不起常量作用。但是,如果只有指针在对象中,则函数是位常量,编译器不会抱怨。"
我不明白修改函数中的指针不能保持其位常量,因为它是成员变量。。。
即使我们假设逐位常量仅适用于指针指向的值,而不适用于指针地址本身。。那么,如果它是类中唯一的成员变量,或者它不是唯一的成员变数,这又有什么关系呢。。
基本上,这意味着如果你有
struct Foo
{
int bar;
};
不能让const成员函数更改bar
的值。
但是,如果bar
是指向int
的指针,则可以在const方法中更改int的值,因为int
实际上不是结构的一部分。
两个版本都实现了相同的目标(即更改int
的值),但在第一个版本中,您破坏了逐位常量,编译器会抱怨,而在第二个版本中则不会。
它是按位const
,因为成员函数只有
修改指针指向的内容
因此对象实例化数据(成员指针)不会只更改它所指向的堆上的对象。
采用以下简单类:
class A
{
public:
A(int d = 0) : data(d) {}
void func() const
{
++data; // Can't do this. That's changing
// the bitwise content of this.
}
private:
int data;
};
和
class B
{
public:
A(int d = 0) : data(new int(d)) {}
void func() const
{
++(*data); // Can do this. That doesn't change
// the bitwise content of this.
}
private:
int* data;
};
如果我读得正确,如果成员函数修改了存储在当前对象中的指针所指向的值,那么它通常是不合格的const
:
class A {
char* string;
public:
void UpCaseString() { strupr(string); }
....
}
UpCaseString()
方法修改"属于"对象的数据,因此它通常不会声明为const。然而,它实际上修改了在当前对象外部分配的一些缓冲区,A
类的实例只有一个指向缓冲区的char*
指针,因此即使对象本身是const
:,也可以修改缓冲区
class A {
char* string;
public:
void UpCaseString() const { strupr(string); }
....
}
void foo(A const &a) {
a.UpCaseString();
}
此处不修改成员a.string
。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- python ctypes and C++ pointers
- arrayfire, pointers, and c++
- C++:关于"valid pointers and references"的澄清
- Python ctypes and void const pointers
- Smart Pointers, this, and Constructors
- Qt and pointers
- visual c++, msxml and smart pointers
- Char* pointers and char[]
- Bitiwise Const and pointers:
- boost::ptr_vector and pointers
- printf and pointers
- c pointers and ctypes