C++ 类型转换(内置类型,string、char*、const char*等)

目录

类型

转换

全部代码


文章适用于已经学了C++语言,对C++类型有一定了解的朋友。对类型转换进行总结,包括内置类型,string,以及由c语言引入的一些类型。

类型

内置数据类型 字节 范围
char 1 个字节 -128 到 127 或者 0 到 255
unsigned char 1 个字节 0 到 255
signed char 1 个字节 -128 到 127
int 4 个字节 -2147483648 到 2147483647
unsigned int 4 个字节 0 到 4294967295
signed int 4 个字节 -2147483648 到 2147483647
short int 2 个字节 -32768 到 32767
unsigned short int 2 个字节 0 到 65,535
signed short int 2 个字节 -32768 到 32767
long int 8 个字节 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
signed long int 8 个字节 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long int 8 个字节 0 到 18,446,744,073,709,551,615
float 4 个字节 精度型占4个字节(32位)内存空间,+/- 3.4e +/- 38 (~7 个数字)
double 8 个字节 双精度型占8 个字节(64位)内存空间,+/- 1.7e +/- 308 (~15 个数字)
long double 16 个字节 长双精度型 16 个字节(128位)内存空间,可提供18-19位有效数字。
wchar_t 2 或 4 个字节 1 个宽字符

字符串

string C++的类

C风格 const char*、char*、char[]

转换

C++类型转换主要分为两种:隐式类型转换、显式类型转换(强制类型转换)。

所谓隐式类型转换,是指不需要用户干预,编译器默认进行的类型转换行为。

四种强制类型转换操作符:static_cast、const_cast、dynamic_cast、reinterpret_cast

还有类的构造方法,类的方法、流等

类型转换及方法
类型转换左转右 方法
char->其他内置类型及const char*、char* 隐式转换
unsigned char、signed char->其他内置类型 隐式转换
unsigned char、signed char->const char*、char* 先转为char,再隐式转换
char、unsigned char、signed char->string 构造方法,push_back、insert等方法
[signed/unsigned] [short/long] int->[signed/unsigned] char +'0'  数值为0~9
[signed/unsigned] [short/long] int->float/[long] double或[signed/unsigned] [short/long] int 隐式转换
float/[long] double -> [signed/unsigned] [short/long] int 显示转换,否则警告(例如,warning C4244: “初始化”: 从“float”转换到“short”,可能丢失数据)
string->const char * 使用string的c_str()函数
string->const char *->char* 先转const char *,再使用const_cast()转char*
[const] char *->string 隐式转换
const char *->char* 使用const_cast()转char*
[const] char *->char[] 使用strncpy_s()函数
char* ->const char* 隐式转换

注:[]表示可选,/表示或者

总结

内置类型隐式转换即可,可能丢失数据

涉及指针使用const_cast,涉及string类使用方法push_back、c_str等

建议不要使用C风格的const char *、char[]等,string不香吗???

    string s("nkjsf");
    const char* ch = s.c_str();
    cout << ch << endl;
    s = "efefd";
    cout << ch << endl;

nkjsf

efefd

ch没有变,但是两次输出不一样。各位学完C再学C++的,字符串这里学学string吧,真的很不错。

全部代码

测试了部分,运行单个函数即可。

/*
Project:TypeConvert
Date:    2020/09/06
Author:  Frank Yu
*/
#include
#include
#include
using namespace std;

void display(string type,string method)
{
	cout <<"转为:"<(cc);
	display("char *", "c_str转为const char *,再使用const_cast()转为char *");
	cout << "转换后:" << c << endl;
}

void constchar2other(const char* cc)
{
	string s = cc;
	display("string", "隐式转换");
	cout << "转换后:" << s << endl;
	char * c = const_cast(cc);
	display("char *", "const_cast()");
	cout << "转换后:" << c << endl;
	char ca[10];
	display("char[]", "strncpy_s()");
	strncpy_s(ca, cc, 10);
	cout << "转换后:" << ca << endl;
}

void char_2other(char* c)
{
	string s = c;
	display("string", "隐式转换");
	cout << "转换后:" << s << endl;
	const char * cc = c;
	display("const char *", "隐式转换");
	cout << "转换后:" << cc << endl;
	char ca[10];
	display("char[]", "strncpy_s()");
	strncpy_s(ca, c, 10);
	cout << "转换后:" << ca << endl;
}

int main()
{
	//char2other('n');
	unsignedchar2other('n');
	//signedchar2other('n');
	//signedchar2other('n');
	//int2other(9);
	//unsignedint2other(9);
	//float2int(9.3);
	//string2other("abcd");
	//const char* cc = "abcd";
	//constchar2other("abcd");
	//char_2other("sdfesgrf");

	//问题1  ch会变
	//string s("nkjsf");
	//const char* ch = s.c_str();
	//cout << ch << endl;
	//s = "efefd";
	//cout << ch << endl;
	//问题2  char2other函数输出cc没有烫 unsignedchar2other输出cc有烫
	//char c = 'n';
	//const char *cc = &c;
	//cout << cc << endl;
}

更多数据结构与算法实现:数据结构(严蔚敏版)与算法的实现(含全部代码)

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

你可能感兴趣的:(常见算法与数据结构实现,c++)