string和char*的区别以及const_cast<>()

首先,string是类,char*属于基本数据类型

其次,const_cast只能改变指针的const属性,而不能改变或者去掉本身的const属性

测试代码:

 

// memcpyTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "string"

using namespace  std;
int _tmain(int argc, _TCHAR* argv[])
{
	string Str = "abcd";
	char *pChar = "mmnddd";
	//pChar[0]='j';                                     // 出现访问冲突异常

	//char *pstr1 = Str.c_str();                        //类型异常
	//const char *pstr1 = Str.c_str();    pstr1[0]='g'; //错误

	char *pStr = const_cast<char*>(Str.c_str());        // 去掉const属性
	pStr[0]='h';

	char *pchar1 = const_cast<char*>(pChar);            // 去掉const属性
	//pchar1[0]='e';                                    // 出现访问冲突异常,去不掉本身的const属性

	//若想要去掉必须分配堆空间
	char *pchar2 = new char[8];
	//pchar2 = pChar;
	//pchar2[0]= 'e';//这样也不行,只是指针指向了同一块内存区域,这块区域谁都不能动

	memcpy(pchar2,pChar,sizeof(pchar2)*2);
	pchar2[strlen(pChar)+1]='\0';
	pchar2[0]='e';                                     //正确    


	return 0;
	
}
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数名, vector<any> args) { auto func = funcMap.find(funcName); if (func != funcMap.end()) { return any_cast<int>((func->second)(args)); } return 0; } 针对这个问题,可以进行以下优化: 1.修改map表:可以使用unordered_map代替map,因为unordered_map使用哈希表,可以快速查找元素,而map使用红黑树,查找元素比较慢。 2.修改函数定义:可以将函数返回值类型设置为auto,让编译器自动推导返回值类型。 3.修改funAll函数:可以使用auto关键字来自动推导func的类型,以及使用const引用参数来避免不必要的复制。同时可以将if语句中的find()和end()合并为一个语句,提高代码的可读性和效率。 优化后的代码如下: const string FUNC1 = "func1"; const string FUNC2 = "func2"; const string FUNC3 = "func3"; auto func1(int a, int b) { return a + b; } auto func2(int a, float b, float c) { return float(a) + b + c; } auto func3(int a, const char* b) { int result = a; auto length = strlen(b); for (size_t i = 0; i < length; i++) { result += b[i] - '0'; } return result; } unordered_map<string, function<any(vector<any>&)>> funcMap = { {FUNC1, [](vector<any>& args) { return func1(any_cast<int>(args[0]), any_cast<int>(args[1])); }}, {FUNC2, [](vector<any>& args) { return func2(any_cast<int>(args[0]), any_cast<float>(args[1]), any_cast<float>(args[2])); }}, {FUNC3, [](vector<any>& args) { return func3(any_cast<int>(args[0]), any_cast<const char*>(args[1])); }} }; int funAll(const string& funcName, vector<any>& args) { auto func = funcMap.find(funcName); if (func != funcMap.end()) { return any_cast<int>((func->second)(args)); } return 0; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值