C/C++八股文day3

C和C++中struct有什么区别?

在C和C++中,struct(结构体)是用于定义复合数据类型的工具,但它们在C和C++中有一些重要的区别。以下是C和C++中struct的主要区别:


1. 默认访问权限

  • C

    • struct的成员默认是公有的(即可以直接访问)。
    • C中没有访问控制的概念(如publicprivateprotected)。
  • C++

    • struct的成员默认是公有的public)。
    • 但C++中可以通过显式指定privateprotected来限制成员的访问权限。

2. 成员函数

  • C

    • struct不能包含成员函数(即函数不能直接定义在struct内部)。
    • 只能包含数据成员。
  • C++

    • struct可以包含成员函数(方法)。
    • 可以像class一样定义构造函数、析构函数、运算符重载等。

3. 继承

  • C

    • 不支持继承。struct不能从其他struct或类型继承。
  • C++

    • 支持继承。struct可以从其他structclass继承。
    • 默认继承方式是public继承(与class的默认private继承不同)。

4. class的关系

  • C

    • 只有struct,没有class的概念。
  • C++

    • structclass几乎完全相同,唯一的区别是默认访问权限
      • struct的默认访问权限是public
      • class的默认访问权限是private

5. 类型名

  • C

    • 定义struct时,必须使用struct关键字来声明变量。
    • 例如:
      struct Point {
          int x;
          int y;
      };
      struct Point p1; // 必须加上 struct 关键字
      
  • C++

    • 定义struct后,可以直接使用结构体名声明变量,无需struct关键字。
    • 例如:
      struct Point {
          int x;
          int y;
      };
      Point p1; // 不需要 struct 关键字
      

6. 初始化

  • C

    • 不支持直接在struct定义中初始化成员变量。
    • 初始化需要通过赋值或使用初始化列表。
  • C++

    • 支持在struct定义中直接初始化成员变量(C++11及以上)。
    • 例如:
      struct Point {
          int x = 0;
          int y = 0;
      };
      

7. 模板

  • C

    • 不支持模板。
  • C++

    • struct可以定义为模板,支持泛型编程。
    • 例如:
      template <typename T>
      struct Box {
          T value;
      };
      Box<int> intBox;
      Box<double> doubleBox;
      

8. 空结构体

  • C

    • 空结构体的大小为0(C标准不允许空结构体,但某些编译器可能支持)。
  • C++

    • 空结构体的大小为1(为了确保每个对象都有唯一的地址)。

总结对比表

特性C 中的 structC++ 中的 struct
默认访问权限公有公有
成员函数不支持支持
继承不支持支持
class 的区别class默认访问权限不同
类型名必须使用 struct 关键字声明变量可以直接使用结构体名声明变量
成员初始化不支持直接初始化支持直接初始化(C++11及以上)
模板不支持支持
空结构体大小0(或编译器相关)1

示例代码

C 中的 struct
#include <stdio.h>

struct Point {
    int x;
    int y;
};

int main() {
    struct Point p1 = {1, 2}; // 必须使用 struct 关键字
    printf("x = %d, y = %d\n", p1.x, p1.y);
    return 0;
}

如何判断一段程序是由C 编译程序还是由C++编译程序编译的?

运用编译标识宏__cplusplus

C和C++有什么不同?

1. 编程范式

  • C

    • 是一种过程式编程语言,主要关注函数和过程。
    • 不支持面向对象编程(OOP)。
  • C++

    • 是一种多范式编程语言,支持过程式编程、面向对象编程(OOP)、泛型编程(模板)和函数式编程。
    • 引入了类(class)、继承、多态等面向对象特性。

2. 面向对象编程(OOP)

  • C

    • 不支持面向对象编程。
    • 没有类、对象、继承、多态等概念。
  • C++

    • 支持面向对象编程。
    • 提供了类(class)、对象、继承、多态、封装等特性。
    • 例如:
      class Animal {
      public:
          virtual void makeSound() {
              cout << "Animal sound" << endl;
          }
      };
      
      class Dog : public Animal {
      public:
          void makeSound() override {
              cout << "Woof!" << endl;
          }
      };
      

3. 标准库

  • C

    • 标准库较为简单,主要包括:
      • 输入输出(stdio.h
      • 字符串处理(string.h
      • 内存管理(stdlib.h
      • 数学函数(math.h
  • C++

    • 标准库更加丰富,包括:
      • 输入输出流(iostream
      • 字符串类(std::string
      • 容器(如 std::vectorstd::map
      • 算法(如 std::sortstd::find
      • 智能指针(如 std::shared_ptrstd::unique_ptr

4. 内存管理

  • C

    • 手动管理内存,使用 malloccallocreallocfree
    • 例如:
      int* arr = (int*)malloc(10 * sizeof(int));
      free(arr);
      
  • C++

    • 支持手动内存管理(使用 newdelete)。
    • 提供了智能指针(如 std::unique_ptrstd::shared_ptr)来自动管理内存。
    • 例如:
      int* arr = new int[10];
      delete[] arr;
      
      // 使用智能指针
      std::unique_ptr<int[]> arr(new int[10]);
      

5. 函数特性

  • C

    • 不支持函数重载。
    • 不支持默认参数。
    • 不支持内联函数(inline 关键字是 C99 引入的,但功能有限)。
  • C++

    • 支持函数重载(同名函数,参数不同)。
    • 支持默认参数。
    • 支持内联函数。
    • 例如:
      void print(int x) { cout << x << endl; }
      void print(double x) { cout << x << endl; } // 函数重载
      void greet(string name = "Guest") { cout << "Hello, " << name << endl; } // 默认参数
      

6. 类型安全

  • C

    • 类型检查较弱,允许隐式类型转换。
    • 例如:
      int x = 10;
      double y = x; // 隐式类型转换
      
  • C++

    • 类型检查更严格,引入了 static_castdynamic_castconst_castreinterpret_cast 等显式类型转换。
    • 例如:
      int x = 10;
      double y = static_cast<double>(x); // 显式类型转换
      

7. 异常处理

  • C

    • 不支持异常处理。
    • 通常通过返回错误码或使用 setjmp/longjmp 来处理错误。
  • C++

    • 支持异常处理机制(trycatchthrow)。
    • 例如:
      try {
          throw runtime_error("An error occurred");
      } catch (const exception& e) {
          cout << e.what() << endl;
      }
      

8. 模板和泛型编程

  • C

    • 不支持模板和泛型编程。
  • C++

    • 支持模板,可以实现泛型编程。
    • 例如:
      template <typename T>
      T add(T a, T b) {
          return a + b;
      }
      

9. 命名空间

  • C

    • 不支持命名空间,容易发生命名冲突。
  • C++

    • 支持命名空间(namespace),用于避免命名冲突。
    • 例如:
      namespace MyLib {
          void print() {
              cout << "MyLib" << endl;
          }
      }
      

10. 结构体(struct

  • C

    • struct 只能包含数据成员,不能包含成员函数。
    • 定义变量时必须使用 struct 关键字。
  • C++

    • struct 可以包含数据成员和成员函数。
    • 定义变量时不需要 struct 关键字。
    • structclass 几乎相同,唯一的区别是默认访问权限(struct 默认为 publicclass 默认为 private)。

11. 预定义宏

  • C

    • 没有 __cplusplus 宏。
  • C++

    • 定义了 __cplusplus 宏,用于检测是否使用 C++ 编译器。

总结对比表

特性C 语言C++ 语言
编程范式过程式编程多范式(过程式、面向对象、泛型等)
面向对象不支持支持
标准库简单(如 stdio.hstdlib.h丰富(如 iostreamvector
内存管理手动(mallocfree手动(newdelete)和智能指针
函数特性不支持重载、默认参数支持重载、默认参数、内联函数
类型安全较弱较强
异常处理不支持支持
模板不支持支持
命名空间不支持支持
结构体仅数据成员数据成员和成员函数
预定义宏__cplusplus__cplusplus

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值