将字符串值复制到类字段中
Copy string value into a class field?
我是新手,学习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
。
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何使用位字段将数据从二进制文件复制到结构中?
- 聚合初始化和删除的复制构造函数,也称为不可复制的 obejcts 作为字段
- C++复制字段省略
- C++11,仅将一个字段复制到向量中
- 为什么在具有引用字段的类中隐式删除复制运算符
- 将包含位字段和动态数据的结构复制到 Char 数组缓冲区中
- 自动复制=按值并支持多态性的适当类型的非静态字段
- 将字符串值复制到类字段中
- 如何从基类 c++ 复制字段
- 如何才能将字符串复制到带有 std::string 字段的结构中
- 无法push_back移动(不可复制与康斯特字段)到矢量
- 继承和复制构造函数-如何从基类初始化私有字段
- 如何通过派生类的方法复制来设置基类字段
- 除一个字段外的所有字段的c++隐式复制
- 使用memcpy将std::vector复制到protobuf中的重复字段
- c++复制构造函数:带有指针列表的字段
- 如何复制具有常量字段的成员
- 智能指针和不可复制的成员字段
- 添加unique_ptr作为类的实例字段,而不是显式地删除复制/赋值函数