diff --git a/Data Types and Literals/asset/Classes-and-Objects-in-C.png b/Data Types and Literals/asset/Classes-and-Objects-in-C.png new file mode 100644 index 00000000..cea2a31f Binary files /dev/null and b/Data Types and Literals/asset/Classes-and-Objects-in-C.png differ diff --git a/Data Types and Literals/asset/Cpp-literals.png b/Data Types and Literals/asset/Cpp-literals.png new file mode 100644 index 00000000..69543a05 Binary files /dev/null and b/Data Types and Literals/asset/Cpp-literals.png differ diff --git a/Data Types and Literals/asset/Cvariables1.png b/Data Types and Literals/asset/Cvariables1.png new file mode 100644 index 00000000..07a9603f Binary files /dev/null and b/Data Types and Literals/asset/Cvariables1.png differ diff --git a/Data Types and Literals/asset/DatatypesInC.png b/Data Types and Literals/asset/DatatypesInC.png new file mode 100644 index 00000000..e8988f63 Binary files /dev/null and b/Data Types and Literals/asset/DatatypesInC.png differ diff --git a/Data Types and Literals/asset/ModifiersInC.png b/Data Types and Literals/asset/ModifiersInC.png new file mode 100644 index 00000000..e4cb56ab Binary files /dev/null and b/Data Types and Literals/asset/ModifiersInC.png differ diff --git a/Data Types and Literals/asset/derived-data-types-in-cpp.webp b/Data Types and Literals/asset/derived-data-types-in-cpp.webp new file mode 100644 index 00000000..135f8343 Binary files /dev/null and b/Data Types and Literals/asset/derived-data-types-in-cpp.webp differ diff --git a/Data Types and Literals/cpp-Data-Type-Conversion.md b/Data Types and Literals/cpp-Data-Type-Conversion.md new file mode 100644 index 00000000..0cb609e9 --- /dev/null +++ b/Data Types and Literals/cpp-Data-Type-Conversion.md @@ -0,0 +1,126 @@ +# C++ 中的类型转换 + +类型转换基本上是从一种类型转换为另一种类型。C++ 中有两种类型转换: +1.**隐式类型转换** 也称为“自动类型转换”。 + +- 由编译器自行完成,无需用户的外部触发。 +- 通常在表达式中有多个数据类型存在时发生。在这种情况下,为了避免数据丢失,会发生类型转换(类型提升)。 +- 所有变量的数据类型都会升级为具有最大数据类型的变量的数据类型。 + +``` +bool -> char -> short int -> int -> + +unsigned int -> long -> unsigned -> + +long long -> float -> double -> long double +``` + +隐式转换可能会丢失信息,可能会丢失符号(当有符号类型隐式转换为无符号类型时),并且可能会发生溢出(当 `long long` 隐式转换为 `float` 时)。 + +**隐式类型转换的示例:** + +``` +// 以下是一个 C++ 中隐式类型转换的例子: + +#include +using namespace std; + +int main() +{ + int x = 10; // 整型数x + char y = 'a'; // 字符型y + + // 字符 'a' 隐式转换为 int 时,其 ASCII 值为 97。 + x = x + y; + + // 变量 x 隐式转换为 float。 + float z = x + 1.0; + + cout << "x = " << x << endl + << "y = " << y << endl + << "z = " << z << endl; + + return 0; +} +``` + +**输出** + +``` +x = 107 +y = a +z = 108 +``` + +2.**显式类型转换:**这个过程也称为类型转换,是用户定义的。用户可以在这里将结果类型转换为特定的数据类型。 + +在 C++ 中,可以通过两种方式进行显式类型转换: + +- **通过赋值转换**:这是通过在表达式前用括号明确指定所需类型来完成的。这也可以被认为是强制转换。 + + **语法** + + ``` + (type) expression + ``` + + 其中 type 表示最终结果将被转换成的数据类型。 + + **样例** + + ``` + // C++程序演示显式类型转换 + + #include + using namespace std; + + int main() + { + double x = 1.2; + + // 从 double 到 int 的显式转换 + int sum = (int)x + 1; + + cout << "Sum = " << sum; + + return 0; + } + ``` + + **输出** + + ``` + Sum = 2 + ``` + +- **使用类型转换运算符进行转换:**类型转换运算符是一种**一元运算符**,它强制将一种数据类型转换为另一种数据类型。 + + C++ 支持四种类型转换: + + 1. **静态转换(Static Cast)** + 2. **动态转换(Dynamic Cast)** + 3. **常量转换(Const Cast)** + 4. **重解释转换(Reinterpret Cast)** + + **样例** + + ``` + #include + using namespace std; + int main() + { + float f = 3.5; + + // 使用类型转换运算符 + int b = static_cast(f); + + cout << b; + } + ``` + + ### 类型转换的优势: + 1.这可以利用类型层次结构或类型表示的某些特性。 + 2.它有助于计算包含不同数据类型变量的表达式。 + + + diff --git a/Data Types and Literals/cpp-Data-Type-Ranges-and-Their-Macros.md b/Data Types and Literals/cpp-Data-Type-Ranges-and-Their-Macros.md new file mode 100644 index 00000000..99bf9fc8 --- /dev/null +++ b/Data Types and Literals/cpp-Data-Type-Ranges-and-Their-Macros.md @@ -0,0 +1,161 @@ +# C++ 中的数据类型范围及其宏 + +在竞争性编程中,通常需要将变量赋值为数据类型所能容纳的最大值或最小值。然而,记住这些大而精确的数字是一项困难的任务。因此,C++ 提供了一些宏来表示这些数字,这样可以直接将它们赋值给变量,而不必实际输入整个数字。以下是一些宏的列表: + +

数据类型

+

范围

+

宏的最小值

+

宏的最大值

+

char

+

-128 to +127

+

CHAR_MIN

+

CHAR_MAX

+

short char

+

-128 to +127

+

SCHAR_MIN

+

SCHAR_MAX

+

unsigned char

+

0 to 255

+
+

+

UCHAR_MAX

+

short int

+

-32768 to +32767

+

SHRT_MIN

+

SHRT_MAX

+

unsigned short int

+

0 to 65535

+
+

+

USHRT_MAX

+

int

+

-2147483648 to +2147483647

+

INT_MIN

+

INT_MAX

+

unsigned int

+

0 to 4294967295

+
+

+

UINT_MAX

+

long int

+

-9223372036854775808 to +9223372036854775807

+

LONG_MIN

+

LONG_MAX

+

unsigned long int

+

0 to 18446744073709551615

+
+

+

ULONG_MAX

+

long long int

+

-9223372036854775808 to +9223372036854775807

+

LLONG_MIN

+

LLONG_MAX

+

unsigned long long int

+

0 to 18446744073709551615

+
+

+

ULLONG_MAX

+

float

+

1.17549e-38 to 3.40282e+38

+

FLT_MIN

+

FLT_MAX

+

float (negative)

+

-1.17549e-38 to -3.40282e+38

+

-FLT_MIN

+

-FLT_MAX

+

double

+

2.22507e-308 to 1.79769e+308

+

DBL_MIN

+

DBL_MAX

+

double (negative)

+

-2.22507e-308 to -1.79769e+308

+

-DBL_MIN

+

-DBL_MAX

+
+ +**样例** + +以下示例展示了数据类型的宏。 + +``` +// 演示数据类型宏的 C++ 代码 +#include // 对于浮点数,双精度浮点数的宏 +#include +#include // 对于整型,字符型宏 + +using namespace std; + +int main() +{ + //使用宏显示数据类型范围 + cout << "char ranges from: " << CHAR_MIN << " to " + << CHAR_MAX << endl; + cout << "\nshort char ranges from: " << SCHAR_MIN + << " to " << SCHAR_MAX << endl; + cout << "\nunsigned char ranges from: " << 0 << " to " + << UCHAR_MAX << endl; + + cout << "\n\nshort int ranges from: " << SHRT_MIN + << " to " << SHRT_MAX << endl; + cout << "\nunsigned short int ranges from: " << 0 + << " to " << USHRT_MAX << endl; + cout << "\nint ranges from: " << INT_MIN << " to " + << INT_MAX << endl; + cout << "\nunsigned int ranges from: " << 0 << " to " + << UINT_MAX << endl; + cout << "\nlong int ranges from: " << LONG_MIN << " to " + << LONG_MAX << endl; + cout << "\nunsigned long int ranges from: " << 0 + << " to " << ULONG_MAX << endl; + cout << "\nlong long int ranges from: " << LLONG_MIN + << " to " << LLONG_MAX << endl; + cout << "\nunsigned long long int ranges from: " << 0 + << " to " << ULLONG_MAX << endl; + + cout << "\n\nfloat ranges from: " << FLT_MIN << " to " + << FLT_MAX << endl; + cout << "\nnegative float ranges from: " << -FLT_MIN + << " to " << -FLT_MAX << endl; + cout << "\ndouble ranges from: " << DBL_MIN << " to " + << DBL_MAX << endl; + cout << "\nnegative double ranges from: " << -DBL_MIN + << " to " << -DBL_MAX << endl; + + return 0; +} +``` + +**输出** + +``` +char ranges from: -128 to 127 + +short char ranges from: -128 to 127 + +unsigned char ranges from: 0 to 255 + +short int ranges from: -32768 to 32767 + +unsigned short int ranges from: 0 to 65535 + +int ranges from: -2147483648 to 2147483647 + +unsigned int ranges from: 0 to 4294967295 + +long int ranges from: -9223372036854775808 to 9223372036854775807 + +unsigned long int ranges from: 0 to 18446744073709551615 + +long long int ranges from: -9223372036854775808 to 9223372036854775807 + +unsigned long long int ranges from: 0 to 18446744073709551615 + +float ranges from: 1.17549e-38 to 3.40282e+38 + +negative float ranges from: -1.17549e-38 to -3.40282e+38 + +double ranges from: 2.22507e-308 to 1.79769e+308 + +negative double ranges from: -2.22507e-308 to -1.79769e+308 +``` + diff --git a/Data Types and Literals/cpp-Data-Types.md b/Data Types and Literals/cpp-Data-Types.md new file mode 100644 index 00000000..35095571 --- /dev/null +++ b/Data Types and Literals/cpp-Data-Types.md @@ -0,0 +1,606 @@ +### C++ 数据类型 + +在声明[变量](https://www.geeksforgeeks.org/variables-in-c/)时,所有变量都使用数据类型来限制存储的数据类型。因此,我们可以说数据类型用于告诉变量它们可以存储的数据类型。每当在C++中定义一个变量时,编译器会根据声明时使用的数据类型为该变量分配一定的内存。每种数据类型所需的内存量是不同的。 + +C++支持多种数据类型,程序员可以根据应用程序的需求选择合适的数据类型。数据类型指定了要存储的值的大小和类型。然而,尽管C++指令在所有机器上都是相同的,存储表示和操作每种数据类型的机器指令也会因机器而异。 + +**C++支持以下数据类型:** + +1. **基本数据类型或内置数据类型或基本数据类型** +2. **派生数据类型** +3. **用户定义数据类型** + +![DatatypesInC](.\asset\DatatypesInC.png) + +### C++中的数据类型主要分为三种: + +**1.基本数据类型:**这些数据类型是内置或预定义的数据类型,用户可以直接使用它们来声明变量。例如:int、char、float、bool等。C++中可用的基本数据类型包括: + +- 整数 +- 字符 +- 布尔 +- 浮点数 +- 双精度浮点数 +- 无值或空 +- 宽字符 + +**2.派生数据类型:**[派生数据类型](https://www.geeksforgeeks.org/derived-data-types-in-c/)是从基本数据类型或内置数据类型派生出来的,被称为派生数据类型,可以分为以下四种: + +- 函数 +- 数组 +- 指针 +- 引用 + +**3.抽象或用户定义数据类型:**[抽象或用户定义数据类型](https://www.geeksforgeeks.org/cpp-data-types/?ref=shm)由用户自己定义。例如,在C++中定义一个类或结构。C++提供了以下用户定义数据类型: + +- 类 +- 结构 +- 联合 +- 枚举 +- typedef定义的数据类型 + +### 基本数据类型 + +- **整数(Integer)**:用于整数数据类型的关键字是**int**。整数通常需要4字节的内存空间,范围从-2147483648到2147483647。 +- **字符(Character)**:字符数据类型用于存储字符。用于字符数据类型的关键字是**char**。字符通常需要1字节的内存空间,范围从-128到127或0到255。 +- **布尔(Boolean)**:布尔数据类型用于存储布尔值或逻辑值。布尔变量可以存储 true(真)或 false(假)。布尔数据类型的关键字是 **bool**。 +- **浮点数(Floating Point)**:浮点数数据类型用于存储单精度浮点值或十进制值。用于浮点数数据类型的关键字是**float**。浮点变量通常需要4字节的内存空间。 +- **双精度浮点数(Double Floating Point)**:双精度浮点数数据类型用于存储双精度浮点值或十进制值。用于双精度浮点数数据类型的关键字是**double**。双精度变量通常需要8字节的内存空间。 +- **空(void)**:空意味着没有任何值。**void**数据类型表示一个无值的实体。void数据类型用于那些不返回值的函数。 +- **宽字符(Wide Character)**:[宽字符数据类型](https://www.geeksforgeeks.org/wide-char-and-library-functions-in-c/)也是一种字符数据类型,但这个数据类型的大小超过了普通的 8 位数据类型。用 `wchar_t` 表示。它通常是 2 或 4 字节长。 +- **sizeof() 运算符(sizeof() operator)**:[sizeof() 运算符](https://www.geeksforgeeks.org/sizeof-operator-c/)用于找出变量/数据类型在计算机内存中占用的字节数。 + +**样例** + +```c++ +int m , x[50]; + +cout< +using namespace std; + +int main() +{ + cout << "Size of char : " << sizeof(char) << endl; + cout << "Size of int : " << sizeof(int) << endl; + + cout << "Size of long : " << sizeof(long) << endl; + cout << "Size of float : " << sizeof(float) << endl; + + cout << "Size of double : " << sizeof(double) << endl; + + return 0; +} +``` + +**输出** + +```c++ +Size of char : 1 +Size of int : 4 +Size of long : 8 +Size of float : 4 +Size of double : 8 +``` + +**时间复杂度:**O(1) + +**空间复杂度:**O(1) + +### 数据类型修饰符 + +顾名思义,数据类型修饰符与内置数据类型一起使用,以修改特定数据类型可以容纳的数据长度。 + +![ModifiersInC](.\asset\ModifiersInC.png) + +C++中可用的数据类型修饰符包括: + +- **有符号(Signed)** +- **无符号(Unsigned)** +- **短(Short)** +- **长(Long)** + +下表总结了当与类型修饰符结合使用时,内置数据类型修改后的大小和范围: + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Data Type

+
+

大小 (以字节为单位)

+
+

范围

+
+

short int

+
+

2

+
+

-32,768 到 32,767

+
+

unsigned short int

+
+

2

+
+

0 到 65,535

+
+

unsigned int

+
+

4

+
+

0 到 4,294,967,295

+
+

int

+
+

4

+
+

-2,147,483,648 到 2,147,483,647

+
+

long int

+
+

4

+
+

-2,147,483,648 到 2,147,483,647

+
+

unsigned long int

+
+

4

+
+

0 到 4,294,967,295

+
+

long long int

+
+

8

+
+

-(2^63) 到 (2^63)-1

+
+

unsigned long long int

+
+

8

+
+

0 到 18,446,744,073,709,551,615

+
+

signed char

+
+

1

+
+

-128 到 127

+
+

unsigned char

+
+

1

+
+

0 到 255

+
+

float

+
+

4

+
+

-3.4×10^38 到 3.4×10^38

+
+

double

+
+

8

+
+

-1.7×10^308 到1.7×10^308

+
+

long double

+
+

12

+
+

-1.1×10^4932 到1.1×10^4932

+
+

wchar_t

+
+

2 或者 4

+
+

1个宽字符

+
+ +> [!CAUTION] +> +> 以上数值可能因编译器而异。在上面的例子中,我们使用的是 GCC 32 位编译器。 +> 我们可以通过使用 sizeof() 运算符并将数据类型的关键字作为参数传递给这个函数,如下所示来显示所有数据类型的大小: + +现在,为了获取数据类型的范围,请参考以下图表。 + +> [!CAUTION] +> +> **头文件**定义了查找基本数据类型范围的宏常量。无符号修饰符的最小值为零。因此,没有为无符号最小值定义宏常量。 + +### 宏常量 + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

名称

+
+

表达

+
+

CHAR_MIN

+
类型为char的对象的最小值
+

CHAR_MAX

+
类型为char的对象的最大值
+

SCHAR_MIN

+
类型为Signed char的对象的最小值
+

SCHAR_MAX

+
类型为Signed char的对象的最大值
+

UCHAR_MAX

+
类型为Unsigned char的对象的最大值
+

CHAR_BIT

+
一个 char 对象中的位数。 +
+

MB_LEN_MAX

+
多字节字符中的最大字节数。 +
+

SHRT_MIN

+
类型为short int的对象的最小值
+

SHRT_MAX

+
类型为short int的对象的最大值
+

USHRT_MAX

+
类型为Unsigned short int的对象的最大值
+

INT_MIN

+
类型为int的对象的最小值
+

INT_MAX

+
类型为int的对象的最大值
+

UINT_MAX

+
类型为Unsigned int的对象的最大值
+

LONG_MIN

+
类型为long int的对象的最小值
+

LONG_MAX

+
类型为long int的对象的最大值
+

ULONG_MAX

+
类型为Unsigned long int的对象的最大值
+

LLONG_MIN 

+
类型为long long int的对象的最小值
+

LLONG_MAX

+
类型为long long int的对象的最大值
+

ULLONG_MAX

+
类型为Unsigned long long int的对象的最大值
+ +实际值取决于特定的系统和库实现,但应反映目标平台上这些类型的限制。LLONG_MIN、LLONG_MAX和ULLONG_MAX是为符合1999年或更高版本C标准的库定义的(这仅包括自2011年以来的C++标准:C++11)。 + +C++程序使用宏常量查找数据类型的范围 + +**样例** + +```C++ +// C++程序演示数据类型的大小 +#include +#include +using namespace std; + +int main() +{ + cout << "Size of char : " << sizeof(char) << " byte" + << endl; + + cout << "char minimum value: " << CHAR_MIN << endl; + + cout << "char maximum value: " << CHAR_MAX << endl; + + cout << "Size of int : " << sizeof(int) << " bytes" + << endl; + + cout << "Size of short int : " << sizeof(short int) + << " bytes" << endl; + + cout << "Size of long int : " << sizeof(long int) + << " bytes" << endl; + + cout << "Size of signed long int : " + << sizeof(signed long int) << " bytes" << endl; + + cout << "Size of unsigned long int : " + << sizeof(unsigned long int) << " bytes" << endl; + + cout << "Size of float : " << sizeof(float) << " bytes" + << endl; + + cout << "Size of double : " << sizeof(double) + << " bytes" << endl; + + cout << "Size of wchar_t : " << sizeof(wchar_t) + << " bytes" << endl; + + return 0; +} +``` + +**输出** + +``` +Size of char : 1 byte +char minimum value: -128 +char maximum value: 127 +Size of int : 4 bytes +Size of short int : 2 bytes +Size of long int : 8 bytes +Size of signed long int : 8 bytes +Size of unsigned long int : 8 bytes +Size of float : 4 bytes +Size of double : 8 bytes +Size of wchar_t : 4 bytes +``` + +**时间复杂度:O(1)** + +**空间复杂度:O(1)** + +```c++ +#include +#include +using namespace std; + +int main() { + // 整数数据类型 + int a = 10; + short b = 20; + long c = 30; + long long d = 40; + cout << "Integer data types: " << endl; + cout << "int: " << a << endl; + cout << "short: " << b << endl; + cout << "long: " << c << endl; + cout << "long long: " << d << endl; + + // 浮点数据类型 + float e = 3.14f; + double f = 3.141592; + long double g = 3.14159265358979L; + cout << "Floating-point data types: " << endl; + cout << "float: " << e << endl; + cout << "double: " << f << endl; + cout << "long double: " << g << endl; + + // 字符数据类型 + char h = 'a'; + wchar_t i = L'b'; + char16_t j = u'c'; + char32_t k = U'd'; + cout << "Character data types: " << endl; + cout << "char: " << h << endl; + wcout << "wchar_t: " << i << endl; + cout << "char16_t: " << j << endl; + cout << "char32_t: " << k << endl; + + // 布尔数据类型 + bool l = true; + bool m = false; + cout << "Boolean data type: " << endl; + cout << "true: " << l << endl; + cout << "false: " << m << endl; + + // 字符串数据类型 + string n = "Hello, world!"; + cout << "String data type: " << endl; + cout << n << endl; + + return 0; +} +``` + +**输出** + +``` +Integer data types: +int: 10 +short: 20 +long: 30 +long long: 40 +Floating-point data types: +float: 3.14 +double: 3.14159 +long double: 3.14159 +Character data types: +char: a +wchar_t: b +char16_t: 99 +char32_t: 100 +Boolean data type: +true: 1 +false: 0 +String data type: +Hello, world! +``` + +这个程序声明了各种数据类型的变量,为它们赋值,然后打印出它们的值。 + +整数数据类型包括int、short、long和long long。这些数据类型表示不同大小的整数。 + +浮点数据类型包括float、double和long double。这些数据类型表示具有不同精度级别的实数。 + +字符数据类型包括char、wchar_t、char16_t和char32_t。这些数据类型表示不同大小的单个字符。 + +布尔数据类型是一个简单的数据类型,只能有两个值之一:true或false。 + +字符串数据类型是字符序列。在这个程序中,我们使用string类声明一个字符串变量并为其赋值。 + +**优点** + +数据类型为程序中的数据提供了一种分类和组织的方式,使其更容易理解和维护。 +每种数据类型都有一个特定的值范围,可以容纳,从而实现对存储数据的更精确控制。 +数据类型通过强制执行关于如何使用和操作数据的严格规则,帮助防止程序中的错误和漏洞。 +C++提供了广泛的数据类型,允许开发人员为特定任务选择最佳类型。 + +**缺点** + +使用错误的数据类型可能会导致程序出现意外的行为和错误。 +一些数据类型,如长双精度浮点数(long double)或字符数组(char),如果过度使用,可能会占用大量内存并影响性能。 +C++ 的复杂类型系统可能会使初学者难以有效地学习和使用该语言。 +数据类型的使用可能会增加程序的复杂性和冗长,使其更难以阅读和理解。 \ No newline at end of file diff --git a/Data Types and Literals/cpp-Derived-Data-Types.md b/Data Types and Literals/cpp-Derived-Data-Types.md new file mode 100644 index 00000000..9308a719 --- /dev/null +++ b/Data Types and Literals/cpp-Derived-Data-Types.md @@ -0,0 +1,230 @@ +# C++中的派生数据类型 + +**数据类型**是用来识别数据种类及其相关操作处理方式的方法。数据类型主要分为三种: + +1. 预定义数据类型 +2. 派生数据类型 +3. 用户定义数据类型![DatatypesInC](.\asset\DatatypesInC.png) + +在这篇文章中,将解释派生数据类型: + +### C++中的派生数据类型 + +派生数据类型是从基本或内置数据类型衍生出来的。它们主要可以分为四种类型: + +1. 函数 +2. 数组 +3. 指针 +4. 引用 + +让我们简要了解以下每种派生数据类型: + +### 1.函数 + +函数是一段被定义用来执行特定明确任务的代码块或程序段。函数通常被定义以避免用户对相同的输入重复编写相同的代码行。所有代码行被集中放置在一个函数内,这样可以在任何需要的地方调用。在C++的每个程序中,main() 是一个默认定义的函数。 + +**语法** + +``` +FunctionType FunctionName(parameters) +``` + +**样例** + +下面的示例演示了C++中函数的使用。 + +``` +// C++程序演示 +// 函数派生类型 + +#include +using namespace std; + +// max here is a function derived type +int max(int x, int y) +{ + if (x > y) + return x; + else + return y; +} + +// main is the default function derived type +int main() +{ + int a = 10, b = 20; + + // Calling above function to + // find max of 'a' and 'b' + int m = max(a, b); + + cout << "m is " << m; + return 0; +} +``` + +**输出** + +``` +m is 20 +``` + +**解释:**上述程序演示了函数派生类型的使用。它定义了一个名为“max”的函数,该函数返回作为输入提供的两个整数中的最大值。在main函数中,调用max函数以找到变量“a”和“b”的最大值并将其存储在m中,最后打印m(最大数)。 + +### 2.数组 + +数组是一系列存储在连续内存位置的项目集合。数组的理念是用一个变量表示多个实例。 + +**语法** + +``` +DataType ArrayName[size_of_array]; +``` + +**样例** + +下面的示例演示了C++中数组的使用。 + +``` +// C++程序演示 +// 数组派生类型 + +#include +using namespace std; +int main() +{ + + // Array Derived Type + int arr[5]; + arr[0] = 5; + arr[2] = -10; + + // this is same as arr[1] = 2 + arr[3 / 2] = 2; + + arr[3] = arr[0]; + + cout << arr[0] << " " << arr[1] << " " << arr[2] << " " + << arr[3]; + + return 0; +} +``` + +**输出** + +``` +5 2 -10 5 +``` + +**解释:**上述程序展示了数组派生类型的使用。它创建了一个整数数组“arr”,并使用索引赋值。然后打印所有数组元素。 + +### 3.指针 + +指针是地址的符号表示。它们使程序能够模拟按引用调用,以及创建和操作动态数据结构。它在C/C++中的一般声明格式为: + +**语法** + +``` +datatype *var_name; +``` + +例如:`int *ptr;` (ptr指向一个存储整型数据的地址)。 + +**样例** + +下面的示例演示了C++中指针的使用。 + +``` +// C++程序演示 +// 指针派生类型 + +#include +using namespace std; + +void geeks() +{ + int var = 20; + + // Pointers Derived Type + // declare pointer variable + int* ptr; + + // note that data type of ptr + // and var must be same + ptr = &var; + + // assign the address of a variable + // to a pointer + cout << "Value at ptr = " << ptr << "\n"; + cout << "Value at var = " << var << "\n"; + cout << "Value at *ptr = " << *ptr << "\n"; +} + +// Driver program +int main() { geeks(); } +``` + +**输出** + +``` +Value at ptr = 0x7ffc04f3f894 +Value at var = 20 +Value at *ptr = 20 +``` + +**解释:**上述程序展示了指针作为派生类型的使用。它声明了一个指针变量 ‘ptr’,并将变量 ‘var’ 的地址赋值给它。然后,它打印出指针的值、变量的值,以及解引用指针的值,展示了C++中指针使用的基础知识。 + +### 4.引用 + +当一个变量被声明为引用时,它成为现有变量的替代名称。通过在声明中放置“&”,可以将变量声明为引用。 + +**语法** + +``` +data_type &ref = variable; +``` + +**样例** + +下面的示例演示了C++中引用的使用。 + +``` +// C++程序演示 +// 引用派生类型 + +#include +using namespace std; + +int main() +{ + int x = 10; + + // Reference Derived Type + // ref is a reference to x. + int& ref = x; + + // Value of x is now changed to 20 + ref = 20; + cout << "x = " << x << endl; + + // Value of x is now changed to 30 + x = 30; + cout << "ref = " << ref << endl; + + return 0; +} +``` + +**输出** + +``` +x = 20 +ref = 30 +``` + +**解释:**上述程序演示了引用派生类型的使用。创建了一个整数变量“x”的引用“ref”。如果“ref”的值改变,“x”的值也会改变,反之亦然。 + +### 总结 + +C++中的派生数据类型是函数、数组、指针和引用,提供了许多有用的工具来处理数据。函数让我们编写可重用的代码。数组帮助高效地管理多个项和数据。指针允许灵活的内存使用和引用。引用提供了一种创建别名和更简单地处理变量的方法。总的来说,这些派生数据类型使C++编码更加系统和有效。 \ No newline at end of file diff --git a/Data Types and Literals/cpp-Literals.md b/Data Types and Literals/cpp-Literals.md new file mode 100644 index 00000000..c6b9c5ce --- /dev/null +++ b/Data Types and Literals/cpp-Literals.md @@ -0,0 +1,278 @@ +## C++中的字面量 + +在C++编程语言中,我们使用字面量来表示固定的值。C++支持各种类型的字面量,包括整数字面量、浮点字面量、字符字面量和字符串字面量。在这篇文章中,我们将讨论C++字面量的所有必要信息及其使用。 + +![Cpp-literals](.\asset\Cpp-literals.png) + +### C++中的字面量是什么? + +字面量是用于表示C++编程语言中使用的常量值的基本元素。这些常量可以包括数字、字符、字符串等。理解和使用字面量在C++中对于数据赋值、计算和数据表示是必不可少的。它们通常作为赋值操作中的右操作数出现。 + +### C++中的字面量类型 + +C++中有五种字面量类型,分别是: + +1. 整数字面量 +2. 浮点数字面量 +3. 字符字面量 +4. 字符串字面量 +5. 布尔字面量 + + + +1. **整数字面量** + +C++中的整数字面量是表示没有小数部分的整数的常量。它们可以是正数或负数,并且可以有不同的进制,如十进制、八进制或十六进制。 + +**样例:** + +```c++ + int integerLiteral = 42; +``` + +**实现:** + +```c++ +// C++程序演示整数字面量的使用 +#include +using namespace std; + +int main() +{ + + int age = 35; // An integer literal + cout << "Age: " << age << endl; + return 0; +} +``` + +**输出** + +```c++ +Age: 35 +``` + +在C++中,整型字面量可以根据它们的进制被分为不同的类型。 + +**1. 十进制字面量(无前缀)** + +十进制字面量表示一个无前缀的十进制整数。 + +**样例** + +```c++ +int decimal = 42; +``` + +**2. 八进制字面量(前缀:0)** + +八进制字面量表示进制为8的整数,并以0前缀开头。 + +**样例** + +```c++ +int octal = 052; // 十进制为42 +``` + +**3. 十六进制字面量(前缀:0x或0X)** + +十六进制字面量表示一个十六进制的整数,并且以0x或0X作为前缀。 + +**样例** + +``` +int hexadecimal = 0x2A; // 十进制为42 +``` + +**4. 二进制字面量(后缀:b或B)** + +二进制字面量表示一个二进制的整数,并且可以有一个b或B的后缀。 + +**样例** + +``` +int binary = 0b101010; // 十进制为42 +``` + +**5. 长整数字面量(后缀:l或L)** + +长整型字面量可以通过添加l或L后缀来表示它是一个长整型(long int)。 + +**样例** + +``` +long int longInteger = 42L; +``` + +**6. 无符号整数字面量(后缀:u或U)** +无符号整型字面量可以通过添加u或U后缀来表示它是一个无符号整型(unsigned int)。 + +**样例** + +``` +unsigned int unsignedInt = 42U; +``` + +**7. 长长整数字面量(后缀:ll或LL)** + +长长整型字面量可以通过添加ll或LL后缀来表示它是一个长长整型(long long int)。 + +**样例** + +``` +long long int longLongInteger = 42LL; +``` + +​ 2.**浮点数字面量** + +C++中的浮点数字面量是表示带有小数部分的数字的常量。这些可以是单精度或双精度值。 + +与整数字面量类似,浮点数字面量也可以通过使用后缀(无后缀)和f分别定义为double或float。默认情况下,C++编译器将所有小数视为double类型。 + +**样例** + +``` +double floatLiteral = 3.14; +``` + +**实现** + +``` +// 这是一个C++程序的示例,用于展示如何使用浮点数字面量。 +#include +using namespace std; + +int main() +{ + // float literal + float e = 2.7f; + + // double literal + double pi = 3.14; + + // long double literal + long double g = 9.8L; + + cout << "The Value of pi: " << pi << endl; + cout << "The value of e: " << e << endl; + cout << "The value of g: " << g << endl; + return 0; +} +``` + +**输出** + +``` +The Value of pi: 3.14 +The value of e: 2.7 +The value of g: 9.8 +``` + + 3.**字符字面量** + +C++中的字符字面量是表示单个字符或转义序列的常量。它们用单引号括起来,您可以使用它们来表示单个字符。 + +**样例** + +``` +char charLiteral = 'A'; +``` + +**实现** + +``` +// 这是一个C++程序的示例,用于展示如何使用字符字面量。 +#include +using namespace std; + +int main() +{ + char grade = 'A'; + + cout << "Grade: " << grade << endl; + return 0; +} +``` + +**输出** + +``` +Grade: A +``` + +4. **字符串字面量** + +C++中的字符串字面量是表示字符序列的常量。它们用双引号括起来,您可以使用它们来表示文本或字符序列。 + +**样例** + +``` +const char* stringLiteral = "Hello, World!"; +``` + +**实现** + +``` +// 这是一个C++程序的示例,用于展示如何使用字符串字面量。 +#include +using namespace std; + +int main() +{ + const char* message = "Hello, GeeksforGeeks!"; + cout << "Message: " << message << endl; + return 0; +} +``` + +**输出** + +``` +Message: Hello, GeeksforGeeks! +``` + +> [!CAUTION] +> +> 字符串字面量是唯一不是右值的字面量。 + +5. **布尔字面量** + +布尔字面量表示真值,只有两个可能的值:true和false。这些值用于布尔表达式和逻辑操作。 + +**样例** + +``` +// 这是一个C++程序的示例,用于展示如何使用布尔字面量。 +#include +using namespace std; + +int main() +{ + // using boolean literals + bool isTrue = true; + bool isFalse = false; + + if (isTrue) { + cout << "isTrue is true" << endl; + } + else { + cout << "isTrue is false" << endl; + } + + if (isFalse) { + cout << "isFalse is true" << endl; + } + else { + cout << "isFalse is false" << endl; + } + return 0; +} +``` + +**输出** + +``` +isTrue is true +isFalse is false +``` + diff --git a/Data Types and Literals/cpp-Type-Modifiers.md b/Data Types and Literals/cpp-Type-Modifiers.md new file mode 100644 index 00000000..d5d04e93 --- /dev/null +++ b/Data Types and Literals/cpp-Type-Modifiers.md @@ -0,0 +1,360 @@ +# C++类型修饰符 + +修饰符在C++中被用来改变或赋予已有数据类型额外的含义。它作为前缀添加到基本数据类型上以改变其含义。修饰符用于改变基本类型的含义,使其更好地符合不同情况下的需求。 + +以下是C++数据类型修饰符: + +1. **signed(有符号)** +2. **unsigned(无符号)** +3. **short(短)** +4. **long(长)** + +![ModifiersInC](.\asset\ModifiersInC.png) + +这些修饰符可以与以下内置数据类型一起使用。 + +### 1.有符号修饰符 + +有符号变量可以存储正整数、负整数和零。 + +**样例** + +``` +signed int a = 45; +signed int b = -67; +signed int c = 0; +``` + +这里, + +- **‘a’ **是一个正整数值。 +- **‘b’ **是一个负整数值。 +- **‘c’ **是一个零值整数。 + +**样例** + +``` +// C++程序,演示有符号修饰符 +#include +using namespace std; + +// 驱动代码 +int main() +{ + cout << "Size of signed int : " << + sizeof(signed int) << + " bytes" << endl; + cout << "Size of signed char : " << + sizeof(signed char) << + " bytes" << endl; + + return 0; +} +``` + +**输出** + +``` +Size of signed int : 4 bytes +Size of signed char : 1 bytes +``` + +> [!CAUTION] +> +> int 数据类型默认就是有符号的。因此,可以直接使用 int 而不是 signed int。 + +### 2.无符号修饰符 + +无符号变量只能存储非负整数值。 + +**样例** + +``` +unsigned int a = 9; +unsigned int b = 0; +``` + +这里, + +- **‘a’** 是一个正整数值。 +- **‘b’ **是一个零值整数。 + +**样例** + +``` +// C++程序,演示符号修饰符 +#include +using namespace std; + +// 驱动代码 +int main() +{ + cout << "Size of unsigned int : " << + sizeof(unsigned int) << + " bytes" << endl; + cout << "Size of unsigned char : " << + sizeof(unsigned char) << + " bytes" << endl; + return 0; +} + +``` + +**输出** + +``` +Size of signed int : 4 bytes +Size of signed char : 1 bytes +``` + +有符号和无符号修饰符之间的区别 +有符号变量的有符号值存储在分配的内存中。然而,无符号变量不存储有符号值。 +有符号整数使用一位来表示符号(正或负),而无符号整数使用所有位来表示非负值。 +无符号类型的值范围从0开始。例如,对于unsigned int,值范围是从0到4,294,967,295。然而,对于signed int,值范围是从-2,147,483,648到2,147,483,647。 + +> [!CAUTION] +> +> 有符号和无符号修饰符只能用于int和char数据类型。 + +### 3.短修饰符 + +short关键字修改了数据类型可以容纳的最小值。它用于范围在−32,767到+32,767之间的小整数。 + +**样例** + +``` +short int x = 4590; +``` + +**样例** + +``` +// C++程序,演示有符号修饰符 +#include +using namespace std; + +int main() +{ + cout << "Size of short int : " << + sizeof(short int) << + " bytes" << endl; + return 0; +} +``` + +**输出** + +``` +Size of short int : 2 bytes +``` + +> [!CAUTION] +> +> short int 可以简写为 short,它们是等价的。 + + + +### 长修饰符 + +long关键字修改了数据类型可以容纳的最大值。它用于范围在-2147483647到2147483647之间的大整数。 + +**样例** + +``` +long int y = 26936; +``` + +**样例** + +``` +// C++程序,演示有符号修饰符 +#include +using namespace std; + +int main() +{ + cout << "Size of long int : " << + sizeof(long int) << + " bytes" << endl; + cout << "Size of long double : " << + sizeof(long double) << + " bytes" << endl; + return 0; +} +``` + +**输出** + +``` +Size of long int : 8 bytes +Size of long double : 16 bytes +``` + +> [!CAUTION] +> +> long int可以写成long,它们是等价的。 + +### 关于数据类型修饰符的重要点 + +**1.数据类型的修饰符可以组合使用。** +例如,signed/unsigned 可以与 long/short 修饰符一起使用。以下是C++程序,用于演示上述概念。 + +**样例** + +``` +// C++程序演示 +// 修饰符可以组合在一起 +#include +using namespace std; + +int main() +{ + cout << "Size of signed long int : " << + sizeof(signed long int) << + " bytes" << endl; + cout << "Size of unsigned short int : " << + sizeof(unsigned short int) << + " bytes" << endl; + return 0; +} +``` + +**输出** + +``` +Size of signed long int : 8 bytes +Size of unsigned short int : 2 bytes +``` + +**1.long 修饰符可以连续使用两次,即 long long,来表示更长的整型。** +它用于比long更大的数字。然而,long long类型修饰符只能与int一起使用。以下是演示上述概念的C++程序。 + +**样例** + +``` +// C++程序演示 long long 修饰符 +#include +using namespace std; + +// Driver Code +int main() +{ + cout << "Size of long long int : " << + sizeof(long long int) << + " bytes" << endl; + return 0; +} +``` + +**输出** + +``` +Size of long long int : 8 bytes +``` + +### 各种带有修饰符的数据类型及其字节大小 + +**1.字符数据类型(char)** + +字符数据类型只允许 signed 和 unsigned 修饰符。当只使用 char 而不是 signed char 或 unsigned char 时,这种类型被称为普通 char。在进行数值计算时,建议使用 signed char 或 unsigned char 而不是普通 char。字符值应该只作为普通 char 存储。 + +
编号

修饰符

+

大小(以字节为单位)

+
+

1.

+

char

+
+

1

+
+

2.

+

signed char

+
+

1

+
+

3.

+

unsigned char

+
+

1

+
+ +**2.整数数据类型(int)** + +
编号

修饰符

+

大小(以字节为单位)

+
+

1.

+

int

+
+

4

+
+

2.

+

signed int

+
+

4

+
+

3.

+

unsigned int

+
+

4

+
+

4.

+

short

+
+

2

+
+

5.

+

signed short

+
+

2

+
+

6.

+

unsigned short

+
+

2

+
+

7.

+

long

+
+

8

+
+

8.

+

signed long 

+
+

8

+
+

9.

+

unsigned long

+
+

8

+
+ +**浮点数(float)和双精度浮点数(double)** +double类型可以与long修饰符一起使用。 + +

编号

+

修饰符

+

大小(以字节为单位)

+
+

1.

+

float

+
+

4

+
+

2.

+

double

+
+

8

+
+

3.

+

long double

+
+

16

+
+ +### C++中的类型限定符: + +类型限定符用于在提供有关值的更多信息的同时,确保数据被正确使用。 + +1. **const:**const类型的对象在执行期间不能被更改。在程序运行时,const对象不能被程序修改。 +2. **volatile:**volatile修饰符告诉编译器,变量的值可以通过程序未明确定义的方式更改。volatile修饰符通知编译器,变量的值可能会以程序中未明确说明的方式更改。 +3. **restrict:**由restrict限定的指针最初是访问它所指向的对象的唯一方式。对象限制只能通过最初由它限定的指针访问的链接。restrict是一种新的限定符,仅在C99中添加。 \ No newline at end of file diff --git a/Data Types and Literals/cpp-Typecasting-Operators.md b/Data Types and Literals/cpp-Typecasting-Operators.md new file mode 100644 index 00000000..dd0d109c --- /dev/null +++ b/Data Types and Literals/cpp-Typecasting-Operators.md @@ -0,0 +1,244 @@ +# C++中的类型转换运算符 + +类型转换运算符在C++中用于类型转换。它们用于将一种数据类型转换为另一种数据类型。C++支持四种类型转换: + +1. static_cast +2. dynamic_cast +3. const_cast +4. reinterpret_cast + +### 1.static_cast + +静态类型转换运算符是C++中最常用的类型转换运算符。它执行编译时的类型转换,主要用于编译器认为安全的显式转换。 + +**静态类型转换运算符的语法。** + +``` +static_cast (expression); +``` + +其中, + +- expression:要转换的数据。 +- new_type:表达式的所需类型。 + +静态类型转换运算符可以用于将相关类型之间的数据进行转换,例如整数类型之间的转换,或者在同一继承层次结构中的指针之间的转换。 + +**示例:静态类型转换运算符** + +``` +// 一个C++程序的示例,用于展示如何使用静态类型转换运算符。 +#include +#include +using namespace std; + +int main() +{ + + int num = 10; + + // 将整型转换为双精度型。 + double numDouble = static_cast(num); + + // 打印数据类型 + cout << typeid(num).name() << endl; + + // 类型转换 + cout << typeid(static_cast(num)).name() << endl; + + // 打印double类型t + cout << typeid(numDouble).name() << endl; + + return 0; +} +``` + +**输出** + +``` +i +d +d +``` + +在这个例子中,我们包含了“typeinfo”库,以便可以使用typeid()函数来检查数据类型。我们定义了一个整数变量‘num’,并使用static_cast将其转换为double类型。之后,我们打印出变量的数据类型,并将static_cast(num)传递给typeid()函数以检查其数据类型。我们可以看到输出“i, d, d”被打印出来,其中‘i’代表整数,‘d’代表双精度浮点数。 + +### 2.动态转换 + +`dynamic_cast` 运算符主要用于执行向下转型(将基类的指针或引用转换为派生类的指针或引用)。它通过在运行时进行检查来确保类型安全,从而保证类型安全。 + +**动态类型转换运算符的语法。** + +``` +dynamic_cast (expression); +``` + +如果转换不可行,dynamic_cast会返回一个空指针(对于指针转换)或抛出一个bad_cast异常(对于引用转换)。 + +**示例:动态类型转换运算符** + +``` +// 一个C++程序的示例,用于展示如何使用动态类型转换运算符。 +#include +using namespace std; + +// 基类 +class Animal { +public: + virtual void speak() const + { + cout << "Animal speaks." << endl; + } +}; + +// 派生类 +class Dog : public Animal { +public: + void speak() const override + { + cout << "Dog barks." << endl; + } +}; + +// 派生类 +class Cat : public Animal { +public: + void speak() const override + { + cout << "Cat meows." << endl; + } +}; + +int main() +{ + // 基类指针指向派生类对象。 + + Animal* animalPtr = new Dog(); + + // 向下转型 + Dog* dogPtr = dynamic_cast(animalPtr); + + // 检查类型转换是否成功。 + if (dogPtr) { + dogPtr->speak(); + } + else { + cout << "Failed to cast to Dog." << endl; + } + + // 转换为其他派生类 + Cat* catPtr = dynamic_cast(animalPtr); + if (catPtr) { + catPtr->speak(); + } + else { + cout << "Failed to cast to Cat." << endl; + } + + delete animalPtr; + return 0; +} +``` + +**输出** + +``` +Dog barks. +Failed to cast to Cat. +``` + +**解释:**输出的第一行是因为 'Animal' 类型的 'animalPtr' 成功地转换为了 'Dog' 类型,并且调用了 'Dog' 类的 speak() 函数。但是将 'Animal' 类型转换为 'Cat' 类型失败了,因为 'animalPtr' 指向的是一个 'Dog' 对象,因此 dynamic_cast 失败,因为这种类型转换是不安全的。 + +### 3.const_cast + +const_cast 操作符用于修改变量的 const 或 volatile 限定符。它允许程序员临时移除对象的常量性并进行修改。使用 const_cast 时必须小心,因为修改一个 const 对象可能导致未定义行为。 + +**const_cast转换运算符的语法。** + +``` +const_cast (expression); +``` + +**示例:静态类型转换运算符** + +``` +// 一个C++程序的示例,用于展示如何使用静态类型转换运算符。 +#include +using namespace std; + +int main() +{ + + const int number = 5; + // 指向 const int 的指针 + const int* ptr = &number; + + // 如果我们使用这个 + // 而不是使用 const_cast + // 我们将得到无效转换的错误 + int* nonConstPtr = const_cast(ptr); + *nonConstPtr = 10; + + cout << "Modified number: " << *nonConstPtr; + + return 0; +} +``` + +**输出** + +``` +Modified number: 10 +``` + +在上面的例子中,我们通过将const类型指针的限定符从const改为非const来修改其值,然后打印修改后的值。 + +### 4.reinterpret_cast + +reinterpret_cast运算符用于将指针转换为任何其他类型的指针。它不执行任何检查以确定转换后的指针是否属于同一类型。 + +**reinterpret_cast转换运算符的语法。** + +``` +reinterpret_cast (expression); +``` + +**示例:reinterpret_cast转换运算符** + +``` +// 一个C++程序的示例,用于展示如何使用reinterpret_cast转换运算符。 +#include +using namespace std; + +int main() +{ + int number = 10; + // 将number的地址存储在numberPointer中 + int* numberPointer = &number; + + // 将指针重新解释为char指针 + char* charPointer + = reinterpret_cast(numberPointer); + + // 打印内存地址和值 + cout << "Integer Address: " << numberPointer << endl; + cout << "Char Address: " + << reinterpret_cast(charPointer) << endl; + + return 0; +} +``` + +**输出** + +``` +Integer Address: 0x7fff64789f1c +Char Address: 0x7fff64789f1c +``` + +在上面的例子中,我们定义了一个 int 类型的变量 'number',然后将 'number' 的地址存储在 int 类型的 'numberPointer' 中。之后,我们将 int 类型的 'numberPointer' 转换为字符指针,并将其存储在 'charPointer' 变量中。为了验证这一点,我们打印了 numberPointer 和 charPointer 的地址。为了打印存储在 'charPointer' 中的地址,我们使用了 reinterpret_cast 来绕过 C++ 的类型检查机制,允许指针被打印为一个通用的内存地址,而不进行任何特定类型的解释。 + +> [!CAUTION] +> +> const_cast 和 reinterpret_cast 通常不推荐使用,因为它们容易导致不同类型的错误。 + diff --git a/Data Types and Literals/cpp-User-Defined-Data-Types.md b/Data Types and Literals/cpp-User-Defined-Data-Types.md new file mode 100644 index 00000000..0b4c14f6 --- /dev/null +++ b/Data Types and Literals/cpp-User-Defined-Data-Types.md @@ -0,0 +1,275 @@ +# C++中的用户定义数据类型 + +**数据类型**是用于标识数据类型及其相关处理操作的手段。在C++中,数据类型用于声明变量。有三种数据类型: + +1. 预定义数据类型 +2. 派生数据类型 +3. 用户定义数据类型![DatatypesInC](.\asset\DatatypesInC.png) + +在本文中,解释了用户定义数据类型: + +### 用户定义数据类型 + +由用户定义的数据类型被称为派生数据类型或用户定义派生数据类型。这些类型包括: + +1. 类(Class) +2. 结构体(Structure) +3. 联合体(Union) +4. 枚举(Enumeration) +5. 类型定义(Typedef) + +下面是对以上类型的详细描述: + +### 1.类 + +类是C++中面向对象编程的基础构建块。它是一种用户定义的数据类型,拥有自己的数据成员和成员函数,可以通过创建该类的实例来访问和使用。类就像是对象的蓝图。 + +**语法** + +![Classes-and-Objects-in-C](.\asset\Classes-and-Objects-in-C.png) + +**样例** + +下面的示例演示了C++中类的使用。 + +```c++ +// C++程序演示 +// 类 + +#include +using namespace std; + +class Geeks { + // 访问说明符 +public: + // 数据成员 + string geekname; + + // 成员函数() + void printname() + { + cout << "Geekname is: " << geekname; + } +}; + +int main() +{ + + // 声明一个类geeks的对象 + Geeks obj1; + + // 访问数据成员 + obj1.geekname = "GeeksForGeeks"; + + // 访问成员函数 + obj1.printname(); + + return 0; +} +``` + +**输出** + +``` +Geekname is: GeeksForGeeks +``` + +**解释:**上述程序定义了一个名为“Geeks”的类,其中包含一个geekname属性和一个printname()函数,用于打印geek的名称。在main函数中,它创建了一个名为obj1的对象,将geekname设置为“GeeksforGeeks”,并调用printname()函数来显示它。 + +### 2.结构体 + +结构体是C/C++中的用户定义数据类型。结构体创建了一种数据类型,可以用来将可能不同类型的项组合成单一类型。 + +**语法** + +``` +struct structName{ +char varName[size]; +int varName; +}; +``` + +**样例** + +下面的示例演示了C++中结构体的使用。 + +```c++ +// C++程序演示 +// 结构体 + +#include +using namespace std; + +// 声明结构体 +struct Point { + int x, y; +}; + +int main() +{ + // 创建结构体数组 + struct Point arr[10]; + + // 访问数组成员 + arr[0].x = 10; + arr[0].y = 20; + + cout << arr[0].x << ", " << arr[0].y; + + return 0; +} +``` + +**输出** + +``` +10, 20 +``` + +**解释:**上述程序通过定义一个名为 “Points” 的结构体,它具有 x 和 y 坐标,展示了结构体的使用。在 main 函数中,它创建了一个这些结构体的数组,设置了它们的值,并打印出来。 + +### 3.联合体 + +与结构体一样,联合体(Union)也是一种用户定义的数据类型。在联合体中,所有成员共享同一块内存位置。例如,在下面的C程序中,x 和 y 共享同一位置。如果我们改变 x,我们可以在 y 中看到相应的变化。 + +**语法** + +``` +Union_Name +{ + // Declaration of data members +}; union_variables; +``` + + + +**样例** + +下面的示例演示了C++中联合体的使用。 + +```c++ +#include +using namespace std; + +// 联合的声明与结构相同 +union test { + int x, y; +}; + +int main() +{ + // 一个联合变量t + union test t; + + // t.y也得到值2 + t.x = 2; + + cout << "After making x = 2:" << endl + << "x = " << t.x << ", y = " << t.y << endl; + + // t.x也更新为10 + t.y = 10; + + cout << "After making Y = 10:" << endl + << "x = " << t.x << ", y = " << t.y << endl; + + return 0; +} +``` + +**输出** + +``` +After making x = 2: +x = 2, y = 2 +After making Y = 10: +x = 10, y = 10 +``` + +**解释:**上述程序展示了联合体的使用。定义了一个名为 “test” 的联合体,它有两个整型成员 x 和 y,在这里 x 和 y 共享同一块内存空间。在 main 函数中,将 x 的值设置为 2 并打印出来。随后,将 y 更新为 10,x 的值也被更新为 10,这展示了联合体共享内存的特性。 + +### 4.枚举 + +枚举(Enumeration 或 enum)是C语言中的一种用户定义数据类型。它主要用于给整型常量分配名称,这些名称使得程序易于阅读和维护。 + +**语法** + +``` +enum nameOfEnum { +varName1 = 1, varName2 = 0 +}; +``` + +**样例** + +下面的示例演示了C++中枚举的使用。 + +```c++ +// 程序演示工作 +// C++中的枚举 + +#include +using namespace std; + +enum week { Mon, Tue, Wed, Thur, Fri, Sat, Sun }; + +int main() +{ + enum week day; + + day = Wed; + + cout << day; + + return 0; +} +``` + +**输出** + +``` +2 +``` + +### 5.类型定义 + +C++允许您使用关键字 `typedef` 明确地定义新的数据类型名称。使用 `typedef` 并不是创建一个新的数据类,而是为现有类型定义一个新名称。这可以提高程序的可移植性(即程序在不同类型的机器上使用的能力,例如迷你机、大型机、微型机等,而无需对代码进行大量更改),因为只需更改 `typedef` 声明。使用 `typedef`,人们还可以通过为标准数据类型提供描述性名称来自我记录代码。 + +**语法** + +``` +typedef typeName; +``` + +其中typeName是任何C++数据类型,name是此数据类型的新名称。这为C++的标准类型定义了另一个名称。 + +**样例** + +下面的示例演示了C++中类型定义的使用。 + +```c++ +// C++程序演示typedef +#include +using namespace std; + +// 在此行之后,BYTE可以代替unsigned char使用 +typedef unsigned char BYTE; + +int main() +{ + BYTE b1, b2; + b1 = 'c'; + cout << " " << b1; + return 0; +} +``` + +**输出** + +``` + c +``` + +### 总结 + +总之,C++有用户定义的数据类型,如类、结构、联合、枚举和typedef。这些用户定义的数据类型允许程序员轻松组织和自定义他们的代码,并编写模块化、高效和可读的代码。因此,用户定义的数据类型提高了C++程序的灵活性和结构,以更好地组织代码。 \ No newline at end of file