C++ 数据类型



在任何语言中编写程序时,您都需要使用各种变量来存储各种信息。变量只不过是保留的内存位置以存储值。这意味着当您创建变量时,您会在内存中保留一些空间。

您可能希望存储各种数据类型的信息,例如字符、宽字符、整数、浮点数、双精度浮点数、布尔值等。根据变量的数据类型,操作系统分配内存并决定在保留的内存中可以存储什么。

原始内置类型

C++ 为程序员提供了丰富的内置和用户定义数据类型。下表列出了七种基本的 C++ 数据类型:

类型 关键字
布尔型 bool
字符型 char
整型 int
浮点型 float
双精度浮点型 double
无值 void
宽字符型 wchar_t

可以使用以下一个或多个类型修饰符修改几种基本类型:

  • 带符号
  • 无符号
  • 短整型
  • 长整型

下表显示了变量类型、存储值所需的内存量以及此类变量中可以存储的最大值和最小值。

类型 典型位宽 典型范围
char 1 字节 -127 到 127 或 0 到 255
无符号字符型 1 字节 0 到 255
带符号字符型 1 字节 -127 到 127
int 4 字节 -2147483648 到 2147483647
无符号整型 4 字节 0 到 4294967295
带符号整型 4 字节 -2147483648 到 2147483647
短整型 2 字节 -32768 到 32767
无符号短整型 2 字节 0 到 65,535
带符号短整型 2 字节 -32768 到 32767
长整型 8 字节 -9223372036854775808 到 9223372036854775807
带符号长整型 8 字节 与长整型相同
无符号长整型 8 字节 0 到 18446744073709551615
长长整型 8 字节 -(2^63) 到 (2^63)-1
无符号长长整型 8 字节 0 到 18,446,744,073,709,551,615
float 4 字节
double 8 字节
长双精度浮点型 12 字节
wchar_t 2 或 4 字节 1 宽字符

变量的大小可能与上表中显示的不同,具体取决于您使用的编译器和计算机。

示例

以下示例将生成您计算机上各种数据类型的正确大小。

#include <iostream>
using namespace std;

int main() {
   cout << "Size of char : " << sizeof(char) << endl;
   cout << "Size of int : " << sizeof(int) << endl;
   cout << "Size of short int : " << sizeof(short int) << endl;
   cout << "Size of long int : " << sizeof(long int) << endl;
   cout << "Size of float : " << sizeof(float) << endl;
   cout << "Size of double : " << sizeof(double) << endl;
   cout << "Size of wchar_t : " << sizeof(wchar_t) << endl;
   
   return 0;
}

此示例使用endl,它在每一行之后插入一个换行符,并使用<<运算符将多个值输出到屏幕。我们还使用sizeof()运算符获取各种数据类型的大小。

当以上代码编译并执行时,会产生以下结果,该结果可能因机器而异:

Size of char : 1
Size of int : 4
Size of short int : 2
Size of long int : 4
Size of float : 4
Size of double : 8
Size of wchar_t : 4

示例

以下是另一个示例

#include <iostream>
#include <limits>
using namespace std;

int main() {

    std::cout << "Int Min " << std::numeric_limits<int>::min() << endl;
    std::cout << "Int Max " << std::numeric_limits<int>::max() << endl;
    std::cout << "Unsigned Int  Min " << std::numeric_limits<unsigned int>::min() << endl;
    std::cout << "Unsigned Int Max " << std::numeric_limits<unsigned int>::max() << endl;
    std::cout << "Long Int Min " << std::numeric_limits<long int>::min() << endl;
    std::cout << "Long Int Max " << std::numeric_limits<long int>::max() << endl;

    std::cout << "Unsigned Long Int Min " << std::numeric_limits<unsigned  long int>::min() <<endl;
    std::cout << "Unsigned Long Int Max " << std::numeric_limits<unsigned  long int>::max() << endl;

}

派生数据类型

从 C++ 中预定义的数据类型获得的数据类型称为派生数据类型。这些可以分为四类,即:

1. 函数

一个函数是最简单的用户定义数据类型形式。它包括一个返回类型、一个函数名和输入参数。

语法

return_type function_name(input_param1, input_param2…){
   <function_body>
}

示例

#include <iostream>
using namespace std;

string func(int n){
   //returns if n is odd or even
   if(n%2) return "Given number is Odd !";
   else return "Given number is Even !";
}
int main(){
   int a;
   //enter a number
   cin>>a;
   cout<<func(a);
   //a simple function to check if
   //number is odd or even
   return 0;
}
输出
Given number is Even !

2. 数组

一个数组是一系列相同数据类型的元素。数组的元素存储在存储器中的连续内存位置。

语法

data_type array_name[array_size];

示例

#include <iostream>
using namespace std;

int main(){
   int arr[5]={1,2,3,2,1};
   //define an integer array of size 5

   for(auto it:arr)
      cout<<it<<" ";
   //print the elements of array

   return 0;
}
输出
1 2 3 2 1 

3. 指针

一个指针是对先前定义的元素的引用。指针的值返回与其关联的元素的地址位置。

语法

data_type * pointer_name=& variable_name;

示例

#include <iostream>
using namespace std;

int main() {
   int a=20;
   //declare variable a
   int *p= &a;
   //assign pointer to a
   cout<<"Address of variable a: "<<p<<endl;
   cout<<"Value of variable a: "<<*p<<endl;

   return 0;
}
输出
Address of variable a: 0x7ffc49a8637c
Value of variable a: 20

4. 引用

一个引用变量用于创建具有相同引用的变量的副本。因此,对引用变量所做的更改也会反映在原始变量上。

语法

data_type & reference_name= variable_name;

示例

#include <iostream>
using namespace std;

int main(){
   int c=11;
   int& refer=c;

   cout<<"Initially value of integer is: "<<c<<endl;

   refer=121;
   cout<<"After changing value using refer variable :"<<c<<endl;

   return 0;
}
输出
Initially value of integer is: 11
After changing value using refer variable :121

用户定义的数据类型

用户直观地定义而不使用任何预定义数据类型的数据类型称为用户定义的数据类型。这些数据类型可以进一步分为五种类型,即:

1. 类

一个在面向对象编程中被定义为一种自定义数据类型,用于构造对象。它是对象的框架,可以包含构造函数、方法和面向对象的概念,如多态、继承等。

语法

class Class_name{
   <class body>

   class_name(parameters) {
      <constructor body>
   }

   return_type method_name(paremeters){
      <method body>
   }

}

示例

#include <iostream>
using namespace std;

class TP{
   public:
      string tp;
    
      void print(){
         cout<<tp<<endl;
      }
};
int main(){
   TP object;
   object.tp="I Love Tutorialspoint !!!";
   object.print();

   return 0;
}
输出
I Love Tutorialspoint !!!

2. 结构体 (struct)

结构体数据类型中,用户可以在结构体主体内部引入多个基本数据类型。

语法

struct struct_name{
   data_type1 var_name1;
   data_type2 var_name2;
   …
}

示例

#include <iostream>
using namespace std;

struct TP{
   string tp;
   int grade;
};
int main(){
   TP object;
   object.tp="I Love Tutorialspoint !!!";
   object.grade=10;

   cout<<object.tp<<endl;
   cout<<"How much would you rate it?"<<" : "<< object.grade;

   return 0;
}
输出
I Love Tutorialspoint !!!
How much would you rate it? : 10

3. 联合体

联合体类似于结构体。在此,所有变量的内存位置相同,并且所有变量共享相同的引用。因此,一个值的更改会导致所有其他值发生更改。

语法

union union_name{
   data_type var_name1;
   data_type var_name2;
};

示例

#include <iostream>
using namespace std;

union TP{
   int tp1,tp2;
};
int main(){
   union TP t;
   t.tp1=2;
   cout<<"Value of tp1 initially: "<<t.tp1<<endl;

   t.tp2=4;
   cout<<"When we change tp2, value of tp1 is : "<<t.tp1<<endl;

   return 0;
}
输出
Value of tp1 initially: 2
When we change tp2, value of tp1 is : 4

4. 枚举 (Enum)

枚举或简称 enum 是一种用户定义的数据类型,用于在程序中为整数常量命名。这提高了程序的用户可读性。

语法

enum enum_name{
   var¬_name1 , var_name2, …
}

示例

#include <iostream>
using namespace std;

enum TP{ C, Java, Python, Ruby, Kotlin, Javascript, TypeScript, Others};

int main(){
   enum TP course;
   cout<<"Which course do you love the most?"<<endl;

   course=Kotlin;
   cout<<"I love the "<<course+1<<"th course !!!";

   return 0;
}

输出

Which course do you love the most?
I love the 5th course !!!

typedef 声明

您可以使用typedef为现有类型创建新名称。以下是使用 typedef 定义新类型的简单语法:

typedef type newname; 

例如,以下代码告诉编译器 feet 是 int 的另一个名称:

typedef int feet;

现在,以下声明是完全合法的,并创建一个名为 distance 的整型变量:

feet distance;

枚举类型

枚举类型声明一个可选的类型名称和一组零个或多个标识符,这些标识符可用作该类型的值。每个枚举器都是一个常量,其类型为枚举。

创建枚举需要使用关键字enum。枚举类型的通用形式为:

enum enum-name { list of names } var-list; 

这里,enum-name 是枚举的类型名称。名称列表以逗号分隔。

例如,以下代码定义了一个名为 colors 的颜色枚举和一个类型为 color 的变量 c。最后,c 被赋值为“blue”。

enum color { red, green, blue } c;
c = blue;

默认情况下,第一个名称的值为 0,第二个名称的值为 1,第三个名称的值为 2,依此类推。但是,您可以通过添加初始化程序为名称指定特定值。例如,在以下枚举中,green的值将为 5。

enum color { red, green = 5, blue };

这里,blue的值将为 6,因为每个名称都比其前面的名称大 1。

广告