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

Cod*_*ith 8 c++ string

我是新手并学习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;
};
Run Code Online (Sandbox Code Playgroud)

和...

#include "Name.h"

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

Name::Name(std::string &s) { ... }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,传递名字时不需要特别做什么?IE浏览器.

Name n = new Name("Cody");
Run Code Online (Sandbox Code Playgroud)

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

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

#include "Name.h"

Name::Name(std::string s)
{
    name = new string(s);
}
Run Code Online (Sandbox Code Playgroud)

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

bil*_*llz 3

你已经很接近了,经过一番按摩后,你的代码可以是这样的:

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;
};
Run Code Online (Sandbox Code Playgroud)

名称.cpp

Name::Name(const std::string& s):name(s)
{
}
Run Code Online (Sandbox Code Playgroud)

这里:name(s)被称为member initializer list.

姓名 n = 新姓名(“科迪”); 是完全有效的吗?实际上我不确定,因为据我所知,“Cody”是一个常量字符串或类似的东西。

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

Name n("Cody");
Run Code Online (Sandbox Code Playgroud)

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

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

 Name *pn = new Name("Cody");
 delete pn;
Run Code Online (Sandbox Code Playgroud)

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

 #include <memory>
 std::shared_ptr<Name> n_ptr(new Name("Cody"));
Run Code Online (Sandbox Code Playgroud)

编辑:

要在其他类中使用Name类,就像在Name类中使用字符串一样,不必使用指针。

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

private:
  Name name_;
};

TestName tn("Cody");
Run Code Online (Sandbox Code Playgroud)