【问题标题】:Initializing constant character pointer of a class初始化类的常量字符指针
【发布时间】:2016-04-04 15:22:46
【问题描述】:

我正在尝试创建一个 Person 类,我决定在其中保持名称和性别不变。这是类定义:

class Person
{
        const char *name;
        int age;
        const char *gen;

        protected:
        Person(const char *, const int ,const char *);   // I want to use this class as a Base class

        public:
        ~Person(); 
}

现在我的问题是如何初始化常量数据成员。我知道我必须使用 初始化列表 来完成这项任务,但即便如此,我如何使用 new 为 char 指针分配内存?我也无法在构造函数体中初始化这些指针。请帮我找到解决方案。

【问题讨论】:

  • 指针不是常量,但指向的字符是常量。不仅如此,constructor 是protected 那么你打算如何构造这个对象呢?举例说明如何使用这个类。
  • 我想用这个类作为学生类@norisknofun 的基类
  • @norisknofun 你能告诉我你所说的关于 const 字符的两件事的区别吗?我从来没有真正理解其中的区别。
  • @SouravKanta 为什么不使用 (const) std::string,这样您就不必考虑分配问题了?

标签: c++ class pointers constants


【解决方案1】:

你可以使用下面的初始化列表,你不需要在这个构造中分配 char 数组。我已经简化了课程,因为您的问题是关于 const char*。

#include <iostream>
#include <string>

class Person
{
    public:
        Person(const char* name, const std::string better_name) : 
            name(name), better_name(better_name) {}
        void print_name() 
        { 
            std::cout << name << " and " << better_name << std::endl; 
        }
    private:
        const char* name;
        const std::string better_name;
};

int main()
{
    Person person("Billy", "Better Billy");
    person.print_name();
    return 0;
}

【讨论】:

  • name 的内存是如何分配的?
  • 也不是Billy存储在只读存储器中吗?我想在堆中为名字和性别分配新的内存。
  • @Sourav Kanta 我会使用 std::string
  • @SouravKanta,你为什么要在堆上放一个短的 const char?我已将std::string 添加到答案中作为说明。它的内容存储在堆上。
  • 典型的 C/C++ 问题:在构造函数中复制(在任何意义上)外部数据时,您在内部使用什么内存模型?在您的构造函数中,名称只能导致静态字符串。用动态字符串在将来的名称中构造人,将给出 UB。带有 const std::string better_name 的示例...更好:)
猜你喜欢
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
相关资源
最近更新 更多