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

Copy string value into a class field?

本文关键字:字段 复制 字符串      更新时间:2023-10-16

我是新手,学习C 。我知道大量的爪哇和一些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的值,该值由构造函数传递在"名称"私有字段中。据我所知,必须创建一个新的字符串对象,然后必须将s的值复制到其中。

i也参数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 世界。:) -Cody

您很接近,您的代码可以在稍作按摩后像这样:

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

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"));

编辑:

要在其他类中使用名称类,当您在名称类中使用字符串时,您不必使用指针。

class TestName
{
public:
   TestName(const Name& n):name_(n){ }
private:
  Name name_;
};
TestName tn("Cody");

您应该在此处使用std::string的常数引用。

正如您所说的,它将防止不必要的副本。但是,为什么不只是指针或恒定指针呢?

常数引用将使您传递到您的函数,这些参数会隐含地调用正确的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;
}

您可以在其cplusplus.com的表格上找到所有std::string's constructors