C++ 的auto关键字

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(); // 等待用户输入,以便程序不会立即退出
}
代码解释:
  1. 函数返回类型GetName() 函数现在返回的是一个 std::string 对象。这意味着返回值可以直接用在需要 std::string 类型的地方。

  2. 使用 auto 关键字:在 main() 函数中,auto name = GetName(); 使用了 auto 关键字,它会自动推导出 name 的类型。在这种情况下,name 的类型被推导为 std::string

  3. 获取字符串长度int a = name.size(); 使用 std::stringsize() 方法来获取字符串的长度,这里长度为 6,因为 "Cherno" 有 6 个字符。

  4. 输出结果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();
}

在这段代码中:

  1. GetName() 函数返回一个 std::string 对象。因为字面量 "Cherno" 是一个字符串常量,std::string 构造函数会自动将其转换为 std::string 对象。
  2. main() 函数中,std::string name = GetName();GetName() 的返回值赋给 name,这样 name 直接就是一个 std::string 对象。
  3. 然后你可以使用 name.size() 来获取字符串的长度。

这种方法不仅更现代化,而且可以避免可能的内存管理问题(如忘记释放 char* 的内存)。

推荐使用示例一

繁琐写法:
在这里插入图片描述
简单写法:
在这里插入图片描述

示例二

在这里插入图片描述
在这里插入图片描述
可以这么简化这个类型:

在这里插入图片描述
在这里插入图片描述
如果这篇文章对你有用,请帮忙点个关注、点赞、收藏,谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值