C++入门——60s从0到1
共用数据的保护
在C++中,常量是一种用于保护共享数据的完整性、可靠性和安全性的重要概念。常量是指在程序运行期间不允许被修改的值。在共用数据的情况下,使用常量可以确保数据不会被意外地修改或破坏,从而提高程序的安全性和可靠性。
除了变量和函数参数可以被声明为常量外,C++还支持常对象、常对象成员、指向对象的常指针、指向常对象的指针变量和对象的常引用等概念。这些概念可以帮助我们更好地保护共用数据的完整性、可靠性和安全性。
常对象
常对象是指将对象声明为常量。这意味着对象的状态不能被修改,包括对象的成员变量和成员函数。在声明常对象时,需要在类定义前加上关键字`const`。例如:
class MyClass { public: void setValue(int value) { data = value; // 可以修改data成员变量 } void printData() const { cout << data << endl; // 只能访问data成员变量,不能修改它的值 } private: int data; }; const MyClass myObj; // 声明一个常对象myObj
在上面的代码中,我们定义了一个名为`MyClass`的类,其中包含一个私有成员变量`data`和一个公有成员函数`setValue`和`printData`。`setValue`函数用于设置`data`成员变量的值,但是由于它是可变的(没有使用关键字`const`),所以可以修改`data`的值。`printData`函数用于输出`data`成员变量的值,但是由于它是常成员函数,所以不能修改`data`的值。然后我们声明了一个名为`myObj`的常对象,并且不能调用`setValue`函数来修改它的状态。
常对象成员
常对象成员是指类的成员变量或成员函数被声明为常量。例如:
class MyClass { public: void setValue(int value) { data = value; // 可以修改data成员变量 } void printData() const { cout << data << endl; // 只能访问data成员变量,不能修改它的值 } private: int data; };
const MyClass myObj; // 声明一个常对象myObj
在上面的代码中,我们将整个类`MyClass`声明为常类型(使用关键字`const`),这意味着所有的公有成员函数都是常成员函数,所有的私有成员变量都是常量。因此我们可以创建一个名为`myObj`的常对象,并且只能调用`printData`函数来输出`data`成员变量的值,而不能调用`setValue`函数来修改它的值。
指向对象的常指针
指向对象的常指针是指指向对象的指针被声明为常量。这意味着指针本身不能被修改,但是它所指向的对象的状态可以被修改。例如:
class MyClass {
public:
void setValue(int value) {
data = value; // 可以修改data成员变量
}
void printData() const {
cout << data << endl; // 只能访问data成员变量,不能修改它的值
}
private:
int data;
};
MyClass* ptr = new MyClass(); // 创建一个普通指针ptr指向MyClass类型的对象
const MyClass* const_ptr = ptr; // 将普通指针ptr转换为指向对象的常指针const_ptr
ptr->setValue(1); // 可以调用setValue函数来修改MyClass对象的data成员变量的值
const_ptr->printData(); // 可以调用printData函数来输出MyClass对象的data成员变量的值,但不能通过const_ptr来改变MyClass对象的data成员变量的值
delete ptr; // 释放内存
```
在上面的代码中,我们首先创建了一个名为`ptr`的普通指针,它指向一个名为`temp`的`MyClass`类型的对象。然后我们将`ptr`转换为一个指向对象的常指针`const_ptr`。由于`const_ptr`是一个指向对象的常指针,所以它所指向的对象的状态不能被修改。然后我们调用了`setValue`函数来设置`temp`对象的`data`成员变量的值为1。最后我们调用了`printData`函数来输出`temp`对象的`data`成员变量的值。注意我们不能通过`const_ptr`来改变`temp`对象的`data`成员变量的值。最后我们释放了内存。
指向常对象的指针变量
指向常对象的指针变量是指将指向对象的指针声明为只读(即指向一个已经被赋予初值的只读变量)。例如:
class MyClass { public: void setValue(int value) { data = value; // 可以修改data成员变量 } private: int data; };
MyClass temp = {10}; // 创建一个普通类型的MyClass对象temp并初始化它的数据成员为10
const MyClass* ptr = &temp; // 将普通类型的MyClass对象的地址赋给指向常类型的MyClass对象的指针ptr
ptr->setValue(20); // 可以调用setValue函数来修改MyClass对象的data成员变量的值,但是不能通过ptr来改变MyClass对象的data成员变量的地址或者其他状态的属性
在上面的代码中,我们首先创建了一个名为`temp`的普通类型的`MyClass`对象并初始化它的数据成员为10。然后我们将普通类型的`temp`对象的地址赋给了指向常类型的`MyClass`对象的指针`ptr`。由于`ptr`是一个指向常类型的指针变量,所以它所指向的对象的状态不能被修改(即不能通过它来改变其他状态属性的值)。然后我们调用了`setValue`函数来设置`temp`对象的`data`数据属性的值为20。注意我们不能通过`ptr`来改变其他状态属性的值。