C 使用std:String v char*在基类中 - 基类具有字符串的固定副本
c++ using std:string v char* in a base class - base class has a redudant copy of the string
在下面的课程中,本教程中说
您也可以使m_speak成为std :: string,但是这样做的缺点 是每只动物都包含"说话"的冗余副本
我试图理解这一点,如何使用string
而不是char*
仅创建string
而不是char*
的冗余副本。
#include <string>
#include <iostream>
class Animal
{
protected:
std::string m_name;
const char* m_speak;
// We're making this constructor protected because
// we don't want people creating Animal objects directly,
// but we still want derived classes to be able to use it.
Animal(std::string name, const char* speak)
: m_name(name), m_speak(speak)
{
}
public:
std::string getName() { return m_name; }
const char* speak() { return m_speak; }
};
class Cat: public Animal
{
public:
Cat(std::string name)
: Animal(name, "Meow")
{
}
};
class Dog: public Animal
{
public:
Dog(std::string name)
: Animal(name, "Woof")
{
}
};
与构造函数:
Cat(std::string name) : Animal(name, "Meow")
" Meow"是一个常数,将在内存中有一个地址。编译器将对每个Cat
使用相同的常数。所有Cat
对象的m_speak
变量将指向该位置。
如果您将m_speak
作为std::string
,则变量m_speak
将将" Meow"复制到其内部缓冲区中。每当您创建猫时,这都会发生,因此会有很多副本。
同样的事情适用于Dog
和" Woof"。
const char*
是指针。指针存储对象的内存地址(在这种情况下,字符串的第一个字符(。在这种情况下,每个实例的成员都指向同一字符串,因此字符串的内容没有重复。
std::string
不是指针。每个 std::string
对象都有自己的存储内容的缓冲区,因此每个实例都有成员存储的字符串的内容。
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 为什么此派生对象无法访问基类的后递减方法?
- 公开最直接的基类模板名称
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- C 使用std:String v char*在基类中 - 基类具有字符串的固定副本
- C++:基类中的字符串参数在派生类解构时进行解构
- 如何创建一个使用wstring的派生类,并调用一个使用字符串的基类构造函数
- C++设计:自定义字符串类的基类构造函数和is-a或has-a关系