2.1. 指针常量(Pointer to Constant)
前言
本文深入探讨了C++中static
和const
关键字的用法、常量指针与指针常量的区别,以及结构体与类之间的差异,旨在帮助程序员更好地理解这些核心概念,以提升编码效率和程序性能。
一、static关键字和const关键字的作用?
1.1.static关键字
在C++中,static
关键字具有多重含义,它的作用取决于其使用的环境。
1.1.1.类成员变量
1.1.2.类成员函数
- 静态成员函数属于类本身,而不是类的任何特定对象。它们可以通过类名直接调用,而不需要创建类的实例。
- 静态成员函数只能访问该类的静态成员变量和其他静态成员函数,因为它们无法访问任何非静态成员。
1.1.3.局部变量
- 在函数内部,
static
修饰的局部变量会保持其值,即使函数调用结束后,其值也不会消失,直到程序结束。这种变量在程序的整个生命周期内只被初始化一次。
1.1.4.全局变量
- 在全局作用域中,
static
修饰的全局变量具有内部链接性,这意味着它们只能在定义它们的文件内访问。
1.2.const 关键字
在C++中,静态变量(static
变量)是一种特殊的变量存储类别,它在程序的整个运行期间只被初始化一次,并且其生命周期与程序的运行期相同。静态变量可以用于类中或全局/命名空间作用域中,它们的行为和用途各有不同。
1.2.1.常量变量
const
修饰的变量是常量,一旦初始化后其值就不能被改变。这有助于防止代码中意外修改变量值。
1.2.2.常量成员函数
- 在类中,
const
修饰的成员函数保证不会修改类的任何成员变量(除了用mutable
修饰的变量)。这样的函数通常用于获取数据,而不会改变对象的状态。 - 常量成员函数可以在常量对象上调用。
1.2.3.常量指针
const
可以用于指针,以确保指针不会用于修改其指向的数据。有多种组合方式,例如:const int* ptr
:指针可以改变,但通过这个指针不能修改所指向的值。int* const ptr
:指针本身的值不能改变,指向的地址不能改变,但可以通过这个指针修改值。const int* const ptr
:指针和指向的值都不能改变。
二、常量指针和指针常量之间有什么区别?
在C++中,常量指针和指针常量是两个不同的概念,它们的区别主要体现在指针本身的可变性以及它们所指向的数据的可变性上。
2.1. 指针常量(Pointer to Constant)
指针常量是指指针本身不能改变(即不能指向另一个地址),但是它指向的数据可以改变(如果数据本身是非const
的)。指针常量通常用来保证指针不会改变指向,增加代码的安全性。
//在这个例子中,ptr 是一个指向整型常量的指针,ptr 指针本身是不可变的,但是可以通过 ptr 来修改 value 的值。
int value = 10;
const int* ptr = &value;
2.2. 常量指针(Constant Pointer)
常量指针是指指针所指向的数据是不可变的,但是指针本身的指向可以改变。
//在这个例子中,ptr 是一个指向整型的常量指针,ptr 指针可以改变指向,但是不能通过 ptr 来修改 value 的值。
const int value = 10;
int* const ptr = &value;
2.3. 同时是常量指针和指针常量
//在这个例子中,ptr 是一个指向整型常量的常量指针,既不能改变 ptr 的指向,也不能通过 ptr 来修改 value 的值。
const int value = 10;
const int* const ptr = &value;
2.4. 总结
- 指针常量:保证指针不会改变指向,但允许通过指针修改数据。
- 常量指针:保证指针所指向的数据不会通过该指针被修改,但允许改变指针的指向。
-
理解这两者之间的区别对于编写安全且可维护的代码非常重要,尤其是在涉及到数据保护和指针操作的复杂场景中。
-
三、结构体和类的区别?
在C++中,结构体(struct
)和类(class
)在功能上非常相似,它们都可以用来创建自定义的数据类型,包含数据成员(属性)和成员函数(方法)。然而,它们之间存在一些区别,主要体现在默认的访问权限和设计理念上:
3.1.默认访问权限不同
- 结构体:在
struct
中,默认的访问权限是public
。这意味着结构体中定义的成员变量和成员函数在没有显式指定访问控制符时,默认是公有的。 - 类:在
class
中,默认的访问权限是private
。这意味着类中定义的成员变量和成员函数在没有显式指定访问控制符时,默认是私有的。
struct MyStruct {
int x; // 默认是public
};
class MyClass {
int x; // 默认是private
};
3.2.传统用途不同
- 结构体:传统上,
struct
用于简单的数据结构,主要用于封装一些相关联的数据。struct
通常只包含数据成员,少有成员函数。 - 类:
class
用于定义更复杂的对象,不仅包含数据成员,还包含成员函数,可以有更多的特性,比如封装、继承、多态等。
3.3.继承的默认访问控制不同
- 结构体:如果结构体继承自另一个结构体或类,继承的访问控制符默认是
public
。 - 类:如果类继承自另一个类或结构体,继承的访问控制符默认是
private
。
struct BaseStruct {};
struct DerivedStruct : BaseStruct { }; // public 继承
class BaseClass {};
class DerivedClass : BaseClass { }; // private 继承
3.4.使用场景
- 结构体:适用于需要轻量级的数据存储的场景,如C风格的数据结构、POD(Plain Old Data)类型。
- 类:适用于更复杂的场景,特别是在需要封装、继承、多态等面向对象特性的情况下。
3.5.总结
虽然struct
和class
在C++中几乎可以互换使用(尤其是在现代C++编程中),但class
通常用于更复杂的对象定义,而struct
则多用于简单的数据结构。两者的主要区别在于默认访问权限和继承的默认访问控制。
总结
通过分析static
和const
的多种用途、比较指针类型及其与结构体和类的不同特性,本文为C++程序员提供了一份关于这些基础但关键概念的全面指南,助力于更高效和安全地编写代码。