参数类型string和const char*哪个更合理?


看一些C++项目时,发现有些函数传递的参数类型是const char*,我在想,为什么一个C++项目要用char*指针?用string会不会更好?

今天,我们就来简单分析一下,函数参数使用string还是const char*,哪个更合适?

两种方式的函数声明如下:

​​​​​​​

void func(const char* s);void func(const std::string& s);

当源是string时:

​​​​​​​

void funcstr(const std::string& s) { std::cout << s; }void funcchar(const char* s) { std::cout << s; }int main() {    std::string s("fdsfds");    funcstr(s);    funcchar(s.c_str());    return 0;}

两种方式没啥区别,都能满足需求,性能也差不多。

然而,当源是"xxxx"这种普通字符串时:

​​​​​​​

void funcstr(const std::string& s) { std::cout << s; }void funcchar(const char* s) { std::cout << s; }int main() {    funcstr("dsdd");    funcchar("dddd");    return 0;}

可以分析出来,当传递的是"xxxx"这种串时,string方式会自动创建出个临时对象,临时对象的构造和析构会降低性能。

再一个,string(basic_string)是个封装类,它占用的空间肯定比const char*更大,这块我后续详细介绍一下string的源码分析吧。

总结如下:

const char*相比于string的优点:

  • 适配性更好,C语言和C++都适用;

  • 效率更高,当传递的是"xxxx"这种串时,string方式会自动创建出个临时对象,临时对象的创建和销毁也是比较耗费性能的;

  • 还是效率,string占用的空间比const char*更大。

说了一大堆const char*的优点,那么,使用string有没有优点呢?

string相比const char*的两个优点:

  • 方便,不需要关心是否释放相关内存,不需要担心内存泄漏问题;

  • 有些string是const char*不能替代的,比如一个string中间有'\0',使用const char*作为参数传递过去会被截断的,也就不符合需求。

最后,大家怎么看?

END

来源:程序喵大人


版权归原作者所有,如有侵权,请联系删除。

参数类型string和const char*哪个更合理?相关推荐

  1. 如何将std :: string转换为const char *或char *?

    如何将<code>std::string转换为char*或const char* ? #1楼 看看这个: string str1("stackoverflow"); c ...

  2. MFC开发- string、const char*、 char* 、char[]相互转换(全)

    string.const char*. char* .char[]四者类型经常会需要转化. 一:转化总结形式如下: 使用时,要对源格式和目标格式进行初始化.源格式赋值为具体的内容,目标格式赋值为空. ...

  3. E0413: 不存在从 “std::string“ 到 “const char *“ 的适当转换函数

    问题来源:PAT乙级1048 string A, B; cin >> A >> B;if(strcmp(A,B)<0){} //错误代码: E0413: 不存在从 &qu ...

  4. 如何解决error C2664: “atof”: 不能将参数 1 从“std::string”转换为“const char *”

    c_str c_str函数的返回值是const char*的,不能直接赋值给char*,所以就需要我们进行相应的操作转化,下面就是这一转化过程. c++语言提供了两种字符串实现,其中较原始的一种只是字 ...

  5. VC2010不能将参数从“CString”转换为“const char *”

    原文地址:http://fengqing888.blog.163.com/blog/static/330114162012016103558408/ 你在vs2010中默认字符集是UNICODE字符集 ...

  6. C++ 类型的值不能用于初始化类型的实体 “const char *“ 类型的值不能用于初始化

    使用VS2019的时候会出现这样的错误 测试出错代码 #include<iostream> #include<stdio.h> #include <string.h> ...

  7. String 转 const char*

    string 是c++标准库里面其中一个,封装了对字符串的操作 把string转换为char* 有3中方法: 1.data如: string str="abc"; char *p= ...

  8. warning:deprecated conversion from string constant to 'char *' 解决方案

    #include <iostream> using namespace std; int fuc(char *a) {     cout << a << endl; ...

  9. deprecated conversion from string constant to ‘char*’

    deprecated conversion from string constant to 'char*' #include <iostream> using namespace std; ...

最新文章

  1. [冲昏头脑]IDEA中的maven项目中学习log4j的日志操作
  2. job for nginx.service failed_用Python操作Kubernetes的Job
  3. 一起谈.NET技术,一句代码实现批量数据绑定[下篇]
  4. 字节跳动教育业务怎么样_[财经]字节跳动教育品牌叫什么名字?大力教育怎么样? - 南方财富网...
  5. word树状分支图_交互设计技能 | 抛弃Word,试试用Excel和Xmind来整理思路吧
  6. PXE高效批量安装和Kickstart无人值守安装——真正完成批量自动安装
  7. Leetcode-2 两数相加【c语言】
  8. JS中关于异步的那点事~
  9. java 静态成员 创建_Java学习笔记11---静态成员变量、静态代码块、成员变量及构造方法的初始化或调用顺序...
  10. Longest Ordered Subsequence 最长上升子序列+DP
  11. SpringBoot之kafka对接topic
  12. 深入探讨apply()方法的作用
  13. SSH连接GitHub并配置ssh key
  14. 一套工地实名制考勤管理系统有哪些软硬件组成
  15. grep的-A-B-选项详解(转)
  16. linux 飞信机器人 下载,飞信机器人FXRobot 's | CN-SEC 中文网
  17. [小甲鱼] 零基础入门python第019讲课后测试题及答案:我的地盘听我的
  18. ArrayList vs LinkedList
  19. 企立方:拼多多用客服机器人怎么样
  20. 阿里云轻量应用服务器Ubuntu20.04上手体验与基本配置(图形界面,ssh,代理等)

热门文章

  1. PCB设计如何防止别人抄板?
  2. 网站或者软件开发流程是什么样子呢?
  3. 10.12NOIP模拟赛
  4. android创建应用小挂件
  5. 管理和理解 suspect_pages 表
  6. vue2知识点:vue-cli脚手架配置代理服务器
  7. 《人性的弱点》哲理名言
  8. Elasticsearch 跨网络、跨集群同步选型指南
  9. CC00060.kafka——|Hadoopkafka.V45|——|kafka.v45|日志存储概述|
  10. 缓存初见——EhCache