一些记录

138 阅读5分钟

一、指针/引用

指针和引用是在许多编程语言中常见的概念,它们用于处理变量和数据的引用或地址。以下是它们的区别:

  1. 概念:

    • 指针:指针是一个变量,它存储了一个内存地址,指向实际的数据存储位置。
    • 引用:引用是一个别名,它为已经存在的变量提供了一个新的名称。
  2. 语法:

    • 指针:指针使用特定的符号(通常是星号 *)来声明和操作。例如,int *ptr; 声明了一个指向整数的指针。
    • 引用:引用使用特定的符号(通常是和被引用变量相同的名称)进行声明和操作。例如,int& ref = variable; 创建了一个整数引用。
  3. 内存管理:

    • 指针:指针可以通过改变指针的值来指向不同的内存位置。它可以进行指针运算,如指针的加法和减法。也就是说,指针需要手动管理内存,包括分配和释放内存。
    • 引用:引用在声明时必须初始化,并且不能更改它引用的变量。它是在变量创建时绑定的,并将一直引用相同的变量。内存管理由编译器自动处理,不需要手动操作。
  4. 空值(null):

    • 指针:指针可以具有空值(null),表示它没有指向任何有效的内存位置。
    • 引用:引用不能为空,必须引用一个已存在的对象。引用必须引用一个有效的变量。

总的来说,指针提供了更大的灵活性和直接操作内存的能力,但也更容易引发错误。引用提供了更简单和安全的方式来使用和传递变量的别名。选择使用指针还是引用取决于具体的需求和编程场景。

二、关于解引用

解引用是指使用指针来访问指针所指向的实际值。在许多编程语言中,我们可以通过在指针变量前面加上星号 (*) 来实现解引用操作。

当我们声明一个指针变量并将其指向某个内存地址时,该指针存储了某个变量的地址。通过解引用操作,我们可以访问该地址中存储的实际值。

以下是一个示例:

int number = 42; // 定义一个整数变量
int* ptr = &number; // 定义一个整数指针,指向 number 的地址

// 解引用操作,获取指针所指向的值
int value = *ptr; // value 现在存储了 number 的值,即 42

在上述示例中,我们使用解引用操作 *ptr 获取指针 ptr 所指向的变量的值,然后将其赋给一个新的变量 value

需要注意的是,只有在指针已经指向某个有效的内存地址时才能进行解引用操作,否则可能引发错误。

三、类和结构体

C++中,结构体(struct)和类(class)都是用户自定义的复合数据类型,用于封装数据和方法。它们的主要区别在于默认的访问权限和成员默认类型。

  1. 默认的访问权限:
  • 结构体的默认访问权限是公共的(public),即结构体的成员可以被外部访问。
  • 类的默认访问权限是私有的(private),即类的成员默认情况下只能在类的内部访问。
  1. 成员默认类型:
  • 结构体的成员默认类型是公共的(public),即结构体的成员默认情况下是公共可访问的。
  • 类的成员默认类型是私有的(private),即类的成员默认情况下是私有的,只能在类的内部访问。

此外,结构体和类在其他方面的使用方法和语法基本相同。可以在它们内部定义成员变量(数据成员)和成员函数(方法),用于操作和处理这些数据。可以通过实例化结构体或类对象来使用它们,并访问和修改对象的成员。

需要注意的是,C++中的类可以继承其他类,而结构体不能继承。类的继承可以实现代码的重用和扩展,而结构体通常用于简单的数据封装和传递。另外,继承的基类中的成员在派生类中默认是私有的,而结构体的成员在派生类型中仍然保持原来的访问权限。

总结起来,结构体和类在默认访问权限和成员默认类型上存在区别,但功能上的差异相对较小,可以根据需要选择合适的方式来组织代码和数据。

四、私有属性访问

在C++中,私有属性只能由类内部的成员函数访问和修改。因此,要给私有属性赋值,你可以通过定义一个成员函数来实现。这个成员函数可以是一个公有的成员函数,或者是一个私有的成员函数,只要它能够在类内部访问到私有属性就可以。

下面给出一个示例:

#include <iostream>

class MyClass {
private:
    int privateValue;

public:
    void setPrivateValue(int value) {
        privateValue = value;
    }

    int getPrivateValue() {
        return privateValue;
    }
};

int main() {
    MyClass obj;
    obj.setPrivateValue(42); // 调用公有成员函数设置私有属性的值
    std::cout << obj.getPrivateValue() << std::endl; // 输出 42

    return 0;
}

在这个示例中,私有属性privateValue被一个公有的成员函数setPrivateValue()设置,并通过公有的成员函数getPrivateValue()获取。这样,我们就能够在类外部给私有属性赋值了。

需要注意的是,为了保证良好的封装性,最好通过公有的成员函数来控制私有属性的赋值和访问,而不是直接暴露私有属性。这样可以更好地维护类的内部状态和数据的一致性。