头文件Dog.h
class Dog { };
main.cpp文件
#include<iostream> #include"Dog.h" using namespace std; int main() { int a; Dog b; cout << "测试" << endl; system("pause"); return 0; }
句子int a;中,之所以能用int直接定义一个整型对象a,是因为库文件中已经定义好了定义整型对象的整型类。
而对象b库文件中没有定义,只能自己定义类。
C++基本内置类型
类型 含义 机器字 最小存储空间
bool 布尔型 -
char 字符型 16位二进制位
wchar_t 宽字符型 16位二进制位
short 短整型 半个机器字 16位二进制位
int 整型 1个机器字 16位二进制位
long 长整型 1个或2个机器字 32位二进制位
float 单精度浮点型 6位有效数字
double 双精度浮点型 10位有效数字
long double 扩展双精度浮点型 10位有效数字
void类型
表示没有返回值。
void可以用来声明一个空指针。
void *p;
注解:
- bool型也是整型。c++标准没有规定用几个二进制位去存储,1、2、8位都有可能。
- C++基本内置类型里面列的前6行都属于整型,是用来存放整数的,后3行属于浮点型,浮点型是用来保存小数的。
- sizeof(short)<=sizeof(int)<=sizeof(long)<=sizeof(longlong)。
- 一般各家的C++编译器都会做的比c++国际标准中的最小占据位数都要多一些。
- 这些数据类型,默认都是有符号的。
测试一下在微软windows系统上,这些类的对象最小占据几个2进制位?
main.cpp如下:
#include<iostream> using namespace std; int main() { void *p; int a; cout << "测试:" << endl; cout << "在windows系统中,bool占据" << sizeof(bool) << "个字节。" << endl; cout << "在windows系统中,char占据" << sizeof(char) << "个字节。" << endl; cout << "在windows系统中,wchar_t占据" << sizeof(wchar_t) << "个字节。" << endl; cout << "在windows系统中,short占据" << sizeof(short) << "个字节。" << endl; cout << "在windows系统中,int占据" << sizeof(int) << "个字节。" << endl; cout << "在windows系统中,long占据" << sizeof(long) << "个字节。" << endl; cout << "在windows系统中,long long占据" << sizeof(long long) << "个字节。" << endl; cout << "在windows系统中,float占据" << sizeof(float) << "个字节。" << endl; cout << "在windows系统中,double占据" << sizeof(double) << "个字节。" << endl; cout << "在windows系统中,long double占据" << sizeof(long double) << "个字节。" << endl; system("pause"); return 0; }
运行结果:
注解:
- 普通的char类的变量只能保存英文字符。
- 宽字符类wchar_t类型的变量能保存中文、日文等非英文字符。
- int跟电脑的cpu字长有关,如果cpu字长是32位的,则int占据4个字节二进制长度。如果cpu字长是64位的,则int占据8个字节二进制长度。如果某一数据类型的对象所占据的二进制位数跟电脑的cpu字长一致,则这种类型的数据处理速度最快。
- 另:在32位机器和64机器中int类型都占用4个字节,编译器可以根据自身硬件来选择合适的大小。
字符型和宽字符型变量或者对象实际上里面保存的是整数。
- char类型的字符串对象。
因为它的长度分配是1个字节,即8位,所以它只能保存英文字符。不能保存中文字符(非英文字符)。
#include<iostream> using namespace std; int main() { char c; c = 'A'; cout << c << endl; printf("%d ",c); wchar_t c2; c2 = '中'; cout << c2 << endl; system("pause"); return 0; }
注解:
- 在电脑里面,一切都是数(0和1组成的数)。'A'是65.
- bool型对象
#include<iostream> using namespace std; int main() { bool a; bool b; bool c; a = true; b = false; c = 39; // 布尔型中,非零就是1 cout << "布尔a是:" << a << endl; cout << "布尔b是:"<<b << endl; cout << "布尔c是:" << c << endl; system("pause"); return 0; }
注解:
- bool类型的对象也是数。
- 有符号和无符号数值类型的取值范围,以char类型为例
#include<iostream> using namespace std; int main() { int a; short b; long c; a = -12; unsigned int a2; unsigned short b2; unsigned long c2; char m; unsigned char m2; /* 8位二进制,能用0、1表示2的8次方个数,0~255 */ signed char m3; /* 一般把最高位设定为符号位,1表示负,0表示正; 2的7次方可以表示128个数, -128(涉及到补码知识)~127 */ printf("SCHAR_MIN:%d ", SCHAR_MIN); //signed char最小值 printf("SCHAR_MAX:%d ", SCHAR_MAX); //signed char最大值 printf("UCHAR_MAX:%d ", UCHAR_MAX); //unsigned char最大值 system("pause"); return 0; }
注解:
- char类型的表示范围是为何不是-127~127,而是-128~127,参考:https://www.cnblogs.com/yibeimingyue/p/13382632.html
main.cpp如下:
#include<iostream> using namespace std; int main() { unsigned char m2; m2 = -1; printf("m2=%d ",m2); system("pause"); return 0; }
注解:
为何是255?为何打出来不是-1?
原因:m2定义的是无符号字符型(整型),但是赋值的时候赋值能有符号的-1了,数字在计算机中都是以补码的形式存储的,-1在计算机中的存储形式是:1111 1111(8个1)(见下图的原码-反码-补码表),它会被当成无符号的补码,无符号的话,补码和原码相同,所以原码是1111 1111的话,化成十进制就是255.
- 浮点型对象
#include<iostream> using namespace std; int main() { float f = 1234567890123456789.0123456789; printf("%f ",f); system("pause"); return 0; }
注解:
前7位是准确的,所以在微软c++浮点型数据对象只有7个有效数字(国际标准中要求最小6位有效数字)。
#include<iostream> using namespace std; int main() { double f = 1234567890123456789.0123456789; printf("%f ",f); system("pause"); return 0; }
注解:
前17位是准确的,所以在微软c++双精度型数据对象有17个有效数字(国际标准中c++要求最小10位有效数字)。
#include<iostream> using namespace std; int main() { long double f = 1234567890123456789.0123456789; printf("%f ",f); system("pause"); return 0; }
注解:
- 前17位是准确的,所以在微软c++ long double型数据对象仍然有17个有效数字(国际标准中c++要求最小10位有效数字)。
- double 的有效数字已经足够存储带小数点的大数。
- float 和 double类的对象主要就是用来保存带小数点的小数的,主要不是用来保存带小数点的很大的大数的。如果保存很大的整数,long long , long ,int就可以。
- 整型数据存取速度很快,浮点型数据存取速度很慢。
#include<iostream> using namespace std; int main() { long double f = 9.0123456789; printf("%f ",f); system("pause"); return 0; }
注解:
double或者long double型对象存储7位有效数字(?)。
总结:
- 定义整型对象一般用int
- 定义小数一般用double,它比float型对象的存取还要快。