gpt4 book ai didi

c++ - 将字符串值复制到类字段中?

转载 作者:可可西里 更新时间:2023-11-01 17:57:04 26 4
gpt4 key购买 nike

我是新手,正在学习 C++。我知道相当多的 Java 和一些 C。

我想做的是创建一个不可变的名称类,它接受一个字符串值,将该字符串复制到一个类字段,然后最终将其散列为一个可以比字符串更有效地解析的 ID。

由于普遍缺乏 C++ 字符串知识,我遇到了瓶颈。这是我到目前为止所拥有的...

#pragma once

#include <string>

class Name
{
public:
Name(std::string s);
~Name(void);

int getId();
std::string getName();

private:
int id;
std::string name;
};

和...

#include "Name.h"

Name::Name(std::string s)
{

}

所以我想做的是将构造函数传入的 s 的值存储在“name”私有(private)字段中。据我所知,必须创建一个新的字符串对象,然后必须将 s 的值复制到其中。

我还认为参数 s 可以而且应该是字符串指针而不是字符串对象(以防止发生不必要的复制)。如果我是对的,那么构造函数应该如下所示,对吧?

Name::Name(std::string &s) { ... }

在这种情况下,传入名称时不需要做任何特别的事情吗?浏览器。

Name n = new Name("Cody");

完全有效?实际上我不确定,因为据我所知“Cody”是一个常量字符串或类似的东西。

因此,如果我都在正确的轨道上,那么实际复制值的正确方法是什么?我认为这是合适的,但我不确定。

#include "Name.h"

Name::Name(std::string s)
{
name = new string(s);
}

提前感谢您的帮助,我知道这是一个基本问题,但我正在慢慢地向 C++ 世界迈进一小步。 :) - 科迪

最佳答案

你已经很接近了,稍微按摩一下你的代码就可以变成这样:

class Name
{
public:
Name(const std::string& s); // add const and reference
~Name(void);

int getId() cosnt; // add const
std::string getName() const; // add const

private:
int id;
std::string name;
};

名称.cpp

Name::Name(const std::string& s):name(s)
{
}

这里的:name(s)叫做member initializer list

Name n = new Name("Cody"); is perfectly valid? Actually I'm not sure since "Cody" to my knowledge is a constant string or something like that.

不,n 不是指针,它不像 java 那样需要为每个对象进行 new。在 C++ 中,你可以

Name n("Cody");

这将调用 Name(const std::string& s) 来初始化对象 n 并使用“Cody”初始化名称字符串。注意:变量n有自动保存期限,超出作用域会被销毁。

要让 n 动态存储持续时间,您需要使用 new/delete 对:

 Name *pn = new Name("Cody");
delete pn;

或者使用智能指针,你不需要调用 delete n_ptr; 因为当 n_ptr 超出范围时也会被销毁:

 #include <memory>
std::shared_ptr<Name> n_ptr(new Name("Cody"));

编辑:

要在其他类中使用Name类,在Name类中使用string也是一样的,不必使用指针。

class TestName
{
public:
TestName(const Name& n):name_(n){ }

private:
Name name_;
};

TestName tn("Cody");

关于c++ - 将字符串值复制到类字段中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14008304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com