文章目录
auto 建议使用的场景,如果你的类型非常长,可以使用,
如果仅仅是 int,string,float等,不建议使用,否则会降低代码的可读性
不建议这么使用auto(一)
如下这么使用auto 会导致代码可读性差,类型比较简短,比如int、float、long、char 等不建议这么使用
不建议这么使用auto(二)
原始常规写法:
可以这么写:
但是如果上面的API 类型改变了,客户端 使用auto,就不需要修改。
经典报错
原因分析:
代码中的错误在于你试图调用 name.size()
函数,而 name
其实是一个 char*
类型的指针,不是一个 std::string
类型的对象。char*
代表一个C风格的字符串,它是一个指向字符数组的指针,不能直接调用 size()
方法。
要解决这个问题,你有以下几种选择:
解决方法一:main函数中 将 char*
转换为 std::string
你可以将 name
转换为 std::string
对象,这样就可以使用 size()
方法:
#include <iostream>
#include <string>
char* GetName() {
return "Cherno";
}
int main() {
auto name = GetName();
int a = std::string(name).size(); // 将char*转换为std::string
std::cout << "Size of name: " << a << std::endl;
std::cin.get();
}
解决方法二:使用 strlen()
计算长度
如果你不想转换为 std::string
,可以使用 strlen()
来计算C风格字符串的长度:
#include <iostream>
#include <cstring> // 为了使用strlen
char* GetName() {
return "Cherno";
}
int main() {
auto name = GetName();
int a = strlen(name); // 使用strlen来获取C风格字符串的长度
std::cout << "Size of name: " << a << std::endl;
std::cin.get();
}
还可以这么修改:
解决方法三:不使用 auto,将 char*
转换为 std::string
是的,将 auto name = GetName();
改为 std::string name = GetName();
是可以的,这样做之后,name
将是一个 std::string
对象,你就可以直接调用 size()
方法了。
这样修改后的代码如下:
#include <iostream>
#include <string>
char* GetName() {
return "Cherno";
}
int main() {
std::string name = GetName(); // 将char*赋值给std::string
int a = name.size(); // 现在可以调用size()方法
std::cout << "Size of name: " << a << std::endl;
std::cin.get();
}
在这段代码中,std::string
会自动将 char*
类型的C风格字符串转换为 std::string
对象,并且你可以直接使用 size()
方法来获取字符串的长度。
解决方法四:修改原函数返回类型为 std::string
这段代码是完全可以的,并且符合现代C++的编程风格。以下是代码的工作原理:
#include <iostream>
#include <string>
std::string GetName() { // 函数返回类型是std::string
return "Cherno"; // 返回一个std::string对象
}
int main() {
auto name = GetName(); // 使用auto接收std::string对象
int a = name.size(); // 调用size()方法获取字符串长度
std::cout << "Size of name: " << a << std::endl;
std::cin.get(); // 等待用户输入,以便程序不会立即退出
}
代码解释:
-
函数返回类型:
GetName()
函数现在返回的是一个std::string
对象。这意味着返回值可以直接用在需要std::string
类型的地方。 -
使用
auto
关键字:在main()
函数中,auto name = GetName();
使用了auto
关键字,它会自动推导出name
的类型。在这种情况下,name
的类型被推导为std::string
。 -
获取字符串长度:
int a = name.size();
使用std::string
的size()
方法来获取字符串的长度,这里长度为 6,因为"Cherno"
有 6 个字符。 -
输出结果:
std::cout << "Size of name: " << a << std::endl;
会输出"Size of name: 6"
。
总结:
- 代码逻辑正确。
- 使用了现代C++中的
auto
关键字,代码更加简洁。 - 返回
std::string
而非char*
,避免了可能的内存管理问题。
解决方法五:原始最常规写法
将 char* GetName()
改为 std::string GetName()
是完全可以的,这样做会使函数返回一个 std::string
对象,而不是一个C风格的字符串指针。
修改后的代码如下:
#include <iostream>
#include <string>
std::string GetName() { // 函数返回类型改为std::string
return "Cherno"; // 返回std::string对象
}
int main() {
std::string name = GetName(); // 接收std::string对象
int a = name.size(); // 使用size()方法
std::cout << "Size of name: " << a << std::endl;
std::cin.get();
}
在这段代码中:
GetName()
函数返回一个std::string
对象。因为字面量"Cherno"
是一个字符串常量,std::string
构造函数会自动将其转换为std::string
对象。- 在
main()
函数中,std::string name = GetName();
将GetName()
的返回值赋给name
,这样name
直接就是一个std::string
对象。 - 然后你可以使用
name.size()
来获取字符串的长度。
这种方法不仅更现代化,而且可以避免可能的内存管理问题(如忘记释放 char*
的内存)。
推荐使用示例一
繁琐写法:
简单写法:
示例二
可以这么简化这个类型:
如果这篇文章对你有用,请帮忙点个关注、点赞、收藏,谢谢~