我是新手并学习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++世界.:) - 科迪
你已经很接近了,经过一番按摩后,你的代码可以是这样的:
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)