【C++】总结1

文章目录

C++中struct和class的区别

structclass 都是用来定义自定义数据类型的关键字

  • 默认访问权限:

    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++:增加了访问权限,可以使用publicprotectedprivate来显式指定成员的访问权限。认访问说明符为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是一个常量指针,不能修改其指向的地址
相关推荐
小灰灰爱代码20 分钟前
C++——将数组a[5]={-1,2,9,-5,7}中小于0的元素置成0。并将其结果输出(要求:用数组名作为函数的参数来实现)
数据结构·c++·算法
冰红茶兑滴水20 分钟前
Linux 线程互斥
linux·c++
咩咩大主教3 小时前
Linux下的简单TCP客户端和服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·网络编程
玄【学生党】3 小时前
【c++】介绍
开发语言·c++
polebugzhuzhu3 小时前
7-50 畅通工程之局部最小花费问题 (kruskal)
c++·算法·图论
玉蜉蝣4 小时前
PAT甲级-1083 List Grades
c++·算法·list·pat甲
ephemerals__4 小时前
【c++】STL简介
开发语言·c++
UestcXiye4 小时前
Leetcode16. 最接近的三数之和
c++·leetcode·排序·双指针·数据结构与算法
-VE-5 小时前
模板初阶(c++)
开发语言·c++
国中之林5 小时前
【C++ Primer Plus习题】17.5
开发语言·c++·学习·刷题