8

我是新手,正在学习 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”私有字段中,由构造函数传入。据我所知,必须创建一个新的字符串对象,然后必须将 s 的值复制到其中。

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

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

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

Name n = new Name("Cody");

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

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

#include "Name.h"

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

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

4

2 回答 2

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;
};

名称.cpp

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

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

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

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

Name n("Cody");

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

要允许n动态存储持续时间,您需要使用新/删除对:

 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 类中使用字符串相同,不必使用指针。

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

private:
  Name name_;
};

TestName tn("Cody");
于 2012-12-23T03:25:38.120 回答
1

您应该使用对std::string此处的常量引用。

正如你所说,它可以防止不必要的复制。但是为什么不只是一个指针或一个常量指针呢?

常量引用将允许您将一些参数传递给您的函数,这些参数会隐式调用 right std::string constructor

因此,简而言之,您可以这样做:

Name::Name(const std::string& s)
{
    this->name = s;
}

// Or even better..
Name::Name(const std::string& s):
    name(s)
{
}

int    main(void)
{
    Name    nick("hello");

    return 0;
}

std::string's constructors您可以在其cplusplus.com 的工作表上找到每一个。

于 2012-12-23T03:18:17.793 回答