
1. C类型概述C是一门强类型语言类型系统是理解C编程的基石。C中的类型主要分为两大类内置类型和用户自定义类型。内置类型包括基本数据类型如整型、浮点型、字符型和复合类型如数组、指针、引用用户自定义类型则包括结构体、联合体、枚举和类等。在C中类型决定了变量在内存中占用的空间大小、取值范围以及可以执行的操作。正确理解和使用类型是写出高效、安全代码的前提。2. boolbool类型是C中用于表示逻辑值的类型只有两个取值true真和false假。在C中bool类型占用1个字节的内存空间。#include iostream using namespace std; int main() { bool isReady true; bool isDone false; cout isReady isReady endl; // 输出 1 cout isDone isDone endl; // 输出 0 // bool类型可以参与逻辑运算 bool result isReady !isDone; cout result result endl; // 输出 1 return 0; }需要注意的是任何非零值在转换为bool时都变为true只有0才转换为false。这在条件判断中非常常见。3. stringstring类型是C标准库提供的字符串类型定义在string头文件中。与C风格的字符数组相比string类型更加安全、灵活支持丰富的操作。3.1 定义与初始化#include string using namespace std; int main() { string s1; // 默认构造空字符串 string s2 Hello; // 直接初始化 string s3(World); // 构造函数初始化 string s4(5, A); // 5个A组成的字符串 AAAAA string s5 s2 s3; // 连接初始化 Hello World return 0; }3.2 基本操作3.2.1 复制string类型支持直接赋值复制这是C风格字符串无法比拟的便利性。string a C; string b a; // 复制构造 string c; c a; // 赋值操作c的内容变为C3.2.2 比较string类型支持使用关系运算符进行比较比较规则基于字典序ASCII码顺序。string s1 apple; string s2 banana; if (s1 s2) { cout s1 小于 s2 endl; // 输出s1 小于 s2 } if (s1 apple) { cout 相等 endl; // 输出相等 }3.2.3 连接使用运算符可以方便地连接两个字符串也可以使用append()成员函数。string first Hello; string second World; string result1 first second; // Hello World string result2 first.append( C); // Hello C3.2.4 修改string支持通过下标访问和修改单个字符也支持插入、删除、替换等操作。string str Hello; str[0] h; // 修改第一个字符变为 hello str.insert(5, World); // 在位置5插入变为 hello World str.erase(0, 1); // 删除从0开始的1个字符变为 ello World str.replace(0, 4, HELLO); // 替换0-4位置的字符变为 HELLO World3.2.5 输出string name C Programming; cout name endl; // 直接输出整个字符串 cout name[0] endl; // 输出第一个字符 C3.2.6 计算与判空string str Hello; int len str.length(); // 返回字符个数结果为5 int size str.size(); // 与length()等价结果为5 bool isEmpty str.empty(); // 判断是否为空返回false string emptyStr; bool isEmpty2 emptyStr.empty(); // 返回true3.2.7 清空string str Hello World; str.clear(); // 清空字符串str变为空字符串 bool isEmpty str.empty(); // 返回true3.2.8 类型转换在实际开发中经常需要在string和C风格字符串const char *之间进行转换。#include string #include cstring using namespace std; int main() { // const char * 转换为 string const char *cstr Hello C; string str(cstr); // 使用构造函数转换 // string 转换为 const char * string s World; const char *ptr s.c_str(); // 使用c_str()函数转换 // 注意c_str()返回的指针在string被修改后可能失效 return 0; }4. 结构体结构体struct是C中用于将不同类型的数据组合在一起的自定义类型。结构体在C中得到了增强与C语言中的结构体有显著区别。在结构体中定义的数据称为成员变量定义的函数称为成员函数也常称为方法。成员变量用于存储数据成员函数用于操作这些数据二者共同构成了结构体的完整功能。需要注意的是成员函数可以直接访问该结构体中的所有成员变量无需任何额外声明这是结构体封装数据与行为的重要特性。#include iostream #include string using namespace std; // 定义结构体 struct Student { string name; int age; double score; // C结构体中可以定义成员函数 void display() { cout 姓名 name 年龄 age 成绩 score endl; } }; int main() { Student stu1; // 创建结构体变量 stu1.name 张三; stu1.age 20; stu1.score 88.5; stu1.display(); // 调用成员函数 // 使用初始化列表 Student stu2 {李四, 22, 92.0}; stu2.display(); return 0; }5. 联合体联合体union是一种特殊的数据类型它允许在同一个内存位置存储不同类型的数据但同一时刻只能使用其中一个成员。联合体的大小等于其最大成员的大小。#include iostream using namespace std; union Data { int i; float f; char str[4]; }; int main() { Data data; data.i 10; cout data.i data.i endl; // 输出 10 data.f 3.14f; cout data.f data.f endl; // 输出 3.14 // 注意此时data.i的值已经被覆盖不再是10 cout data.i data.i endl; // 输出不确定值 return 0; }联合体常用于节省内存空间或者在需要以不同方式解释同一块内存数据的场景中例如网络协议解析、类型转换等。6. 枚举枚举enum是一种用户自定义类型用于定义一组命名的整型常量。C11引入了强类型枚举enum class解决了传统枚举的一些问题。#include iostream using namespace std; // 传统枚举 enum Color { RED, // 默认值为0 GREEN, // 默认值为1 BLUE // 默认值为2 }; // 可以指定值 enum Week { MON 1, TUE 2, WED 3, THU 4, FRI 5, SAT 6, SUN 7 }; // C11强类型枚举 enum class Status { SUCCESS, FAILURE, PENDING }; int main() { Color c RED; cout RED c endl; // 输出 0 Week w FRI; cout FRI w endl; // 输出 5 // 强类型枚举需要使用作用域运算符访问 Status s Status::SUCCESS; // cout s endl; // 错误强类型枚举不能直接输出 return 0; }7. C/C结构体区别C中的结构体在C语言结构体的基础上进行了重大扩展主要区别如下对比项C语言结构体C结构体成员函数不能定义成员函数可以定义成员函数访问修饰符不支持支持public、private、protected继承不支持支持继承构造函数/析构函数不支持支持使用struct关键字必须加struct关键字可以省略struct关键字模板支持不支持支持模板// C语言中的使用方式 struct Point { int x; int y; }; // 使用时必须写 struct Point p1; // C中的使用方式 struct Point { int x; int y; // 可以定义构造函数 Point(int a, int b) : x(a), y(b) {} // 可以定义成员函数 void print() { cout ( x , y ) endl; } }; // 使用时可以直接写 Point p1(1, 2);8. class类类class是C面向对象编程的核心概念。类将数据成员变量和操作数据的方法成员函数封装在一起实现了数据隐藏和抽象。#include iostream #include string using namespace std; class Person { private: string name; int age; public: // 构造函数 Person(string n, int a) : name(n), age(a) {} // 成员函数 void setName(string n) { name n; } string getName() { return name; } void display() { cout 姓名 name 年龄 age endl; } }; int main() { Person p(王五, 25); p.display(); // 输出姓名王五年龄25 p.setName(赵六); cout p.getName() endl; // 输出赵六 return 0; }8.1 访问修饰符C中的访问修饰符用于控制类成员的访问权限共有三种public、private和protected。public公有成员可以在类外部直接访问。private私有成员只能在类内部访问外部无法直接访问。protected受保护成员在类内部可以访问在派生类中可以访问但在类外部不能访问。class Example { private: int privateVar; // 私有成员外部不可访问 protected: int protectedVar; // 受保护成员派生类可访问 public: int publicVar; // 公有成员外部可访问 void setPrivate(int v) { privateVar v; // 类内部可以访问私有成员 } int getPrivate() { return privateVar; } }; int main() { Example e; e.publicVar 10; // 正确公有成员可以直接访问 // e.privateVar 20; // 错误私有成员不能直接访问 // e.protectedVar 30; // 错误受保护成员不能直接访问 e.setPrivate(20); // 通过公有成员函数访问私有成员 cout e.getPrivate() endl; // 输出 20 return 0; }8.2 class和struct区别在C中class和struct在语法上非常相似主要区别在于默认访问权限和默认继承方式。对比项structclass默认访问权限publicprivate默认继承方式public继承private继承使用习惯多用于简单的数据结构多用于面向对象设计模板参数可以可以// struct默认成员是public struct MyStruct { int x; // 默认public外部可以直接访问 }; // class默认成员是private class MyClass { int x; // 默认private外部不能直接访问 }; int main() { MyStruct s; s.x 10; // 正确struct成员默认public MyClass c; // c.x 10; // 错误class成员默认private return 0; }在实际开发中如果只是需要组合一些数据通常使用struct如果需要封装数据和行为实现面向对象设计则使用class。9. 总结本文系统地介绍了C编程的基础知识包括类型系统、bool和string类型的使用、结构体、联合体、枚举的定义与应用以及面向对象编程中class和struct的区别。掌握这些基础知识是深入学习C面向对象编程、模板编程和STL库的前提。建议读者在理解概念的基础上动手编写代码实践加深对C类型系统和面向对象特性的理解。