文章目录
C++中struct和class的区别
struct
和 class
都是用来定义自定义数据类型的关键字
-
默认访问权限:
struct:默认成员访问权限是public
class:默认的成员访问权限是private
-
方法和数据成员
struct:包含数据成员和成员函数,但通常在结构体中更多地用于组织数据,而较少使用成员函数
class:包含数据成员和成员函数,常用于面向对象的编程,包含数据和相关的操作方法
-
继承:
struct:默认是public继承
class:默认是private继承
-
总之:任何可以使用class完成的工作,同样可以使用struct完成。如果你希望更加面向对象,使用成员函数和封装特性,则更倾向于使用
class
。而如果你只是用于简单的数据组织,而不需要成员函数,可以使用struct
。
C++和C的struct区别
-
成员函数:
C:struct不能有成员函数,只能包含成员变量
C++:不仅可以包含成员变量,还可以包含成员函数,因此可以拥有更多面向对象的特性
-
继承:
C:struct:不支持继承
C++:支持继承,可以实现面向对象的继承关系
-
访问权限修饰符
C:C语言没有访问权限修饰符的概念,所有成员都默认为公共。
C++:增加了访问权限,可以使用
public
、protected
和private
来显式指定成员的访问权限。认访问说明符为public(为了与C兼容) -
构造函数和析构函数:
C:在C语言中,没有构造函数和析构函数的概念,
struct
不能有构造函数和析构函数。C++:在C++中,
struct
可以有构造函数和析构函数,用于对象的初始化和资源的释放。
static关键字的作用
-
静态变量
在函数内部声明的静态变量,该变量在函数执行期间保持其值,不会在每次函数调用时重新初始化,具有记忆性,其作用范围与局部变量相同,函数退出后仍然存在,但不能使用
在类中声明的静态成员变量,该变量是类的所有对象共享的变量。它们在类的所有对象之间是唯一的,静态成员变量必须在类外进行定义和初始化。
-
静态函数
静态函数只与类关联,不依赖于类的任何对象,可以直接通过类名来调用,而不需要创建类的对象
静态函数只能访问静态成员变量和其他静态成员函数,因为它们没有this指针(访问对象的指针)
-
静态局部变量
只会在首次进入函数时被初始化,而不会在每次函数调用时重新初始化,它们在函数调用期间保持其值,即使函数返回,其值在下次调用时也会保持
cpp
void myFunction() {
static int staticLocalVar = 0;
// 该变量在首次进入函数时初始化,然后在函数调用期间保持其值
}
静态局部变量仅在声明它的函数内部可见,不会对其他函数产生影响。每个函数调用都会有自己的静态局部变量实例。在其他函数内部无法直接访问该静态局部变量
- 静态类
C++中const的作用
-
常量变量
const用于修饰变量,表示该变量是一个常量,其值在 初始化后不能被修改
常量变量必须在声明时进行初始化,之后不能再修改其值
常量变量通常用于存储不会变化的值,如常数、配置参数等
-
指针和引用
const修饰引用表示常引用,表示不能通过该引用来修改所引用的值
const修饰指针分为两种情况,常指针和指针常量,常指针表示不能修改该指针指向的地址;指针常量表示不能通过指针修改所指向变量的值。
cpp
int * const p; //常指针,const修饰指针
const int* p; //指针常量,const修饰 *p
int const *p; //指针常量,const修饰 *p
-
常量成员函数
const用于修饰成员函数,表示该成员函数是一个常量成员函数,常函数不能修改类的非静态成员变量。
常成员函数对于类的常量对象调用时非常有用,它保证在调用常量成员函数时不会修改对象的状态。
-
常量对象
const用于修饰对象,表示该对象为常量对象,不能通过该对象修改其成员变量
常量对象只能调用常量成员函数,以保证在对象上不会产生修改
总之,const关键字的使用可以提高代码的安全性和可读性,它可以确保在特定情况下数据的不可变性,避免意外的修改,同时使代码更加易于理解和维护。
数组名和指向数组首元素的指针区别
-
类型
数组名:数组名表示整个数组的标识,不是真正意义上的指针,可以理解为一个常指针(const pointer)指向数组的首地址,并且不能被修改。在表达式中,数组名会被自动转换为指向数组首元素的指针。
指向数组首元素的指针:它是一个真正的指针,它指向数组中的第一个元素,可以进行指针运算,并且可以改变指针的值
-
用途
数组名:主要用于表示整个数组,比如传递数组给函数时,数组名会被自动转换为指向数组首元素的指针来进行传递。但是在一些情况下,如
sizeof
操作符和取地址操作符&
,数组名表示整个数组的大小和地址。指向数组首元素的指针:可以用于访问数组中的元素,可以进行指针运算(如指针加减),以及传递给函数用于访问数组的元素。
-
修改
数组名:数组名是一个常量指针,不能修改其指向的地址,即不能将数组名指向另一个数组,也不能进行自加、自减等操作
指向数组首元素的指针:指针可以被修改,可以让指针指向其他的数组或者数组的不同位置。
cpp
int arr[5] = {1, 2, 3, 4, 5};
// 示例1:数组名和指针的用途和转换
int* ptr = arr; // 数组名arr会被转换为指向数组首元素的指针
// 示例2:修改指针的值
int arr2[3] = {10, 20, 30};
int* ptr2 = arr2; // ptr2指向arr2的首元素
ptr2++; // 指针加1,指向arr2的第二个元素
// 示例3:修改数组名的值(不允许,会报错)
// arr = arr2; // 错误!数组名arr是一个常量指针,不能修改其指向的地址