【问题标题】:Changing class object with function c++使用函数 c++ 更改类对象
【发布时间】:2018-03-07 18:17:09
【问题描述】:

如何使用函数更改类对象,例如“per.name”?原型设计有必要吗?函数调用?这是按值传递还是引用传递?

#include <iostream>
#include <string>
using namespace std; 


class Person {
    public:

    char* name; 
    int age;
    double weight;
    double height; 

    };

int main()
{ 
 Person per;
 per.name = "John"; //change per.name
 cout << per.name << endl;
 }

我想改名约翰。这是复制的吗?

【问题讨论】:

  • 1. per.name = "John"; 使用 C++ 中不再支持的旧转换。您不能将字符串文字分配给非常量 char*。 2.给name分配一个新地址不会复制它现在指向的字符串的内容。
  • @FrançoisAndrieux 在这种情况下,您所说的“旧转换”是什么意思?这与const char*char* 有关吗?
  • @tadman char *s = "Hallo"; 曾经是被允许的,尽管 "Hallo"const 并且 *s = 'W'; 是 UB。在某些时候,C++ 摆脱了这一点并需要正确的类型 const char *s = "Hallo";,这使得 *s = 'W'; 无法编译。
  • @tadman 过去将const char[] 的地址分配给char* 是合法的。这在 c++03 中已弃用并在 c++11 中删除。
  • @nwp 是的,这是有道理的。出于某种原因,我正在考虑其他类型的转换,可能是因为我在 Rust 和 Swift 上花费了太多时间。

标签: c++ function class object


【解决方案1】:

char* name; 允许您存储指向某个字符或以 NUL 结尾的可变长度文本的非const 指针。因为它不是const,所以 C++ 编译器不允许您将其指向不允许修改的文本,例如字符串文字(您的“John”)。

你最好添加...

#include <string>

...在您的文件顶部并将name 成员变量的定义更改为:

std::string name;

这会将您分配的任何文本的副本存储到Person 对象实例中的字段中。

(一些非常古老的 C++ 编译器确实允许将非const 字符指针指向字符串文字以与早期 C 标准兼容,并且当前编译器有时仍会支持,如果使用命令行参数明确要求,任何尝试“写入”指针以修改文本通常会导致程序在运行时崩溃。如果您使用的教科书或参考资料建议将 char* 指向字符串文字,请获得更好的现代参考。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多