代码之家  ›  专栏  ›  技术社区  ›  GenerationLost

函数中的C++常量参数

  •  0
  • GenerationLost  · 技术社区  · 7 年前

    我正在继续用C++学习uni,我遇到了一些严重的理解问题,涉及指针、常量参数和类实现的所有基础知识(与C++相比,Java中的这些知识非常简单)

    这是我对类“Person”的简单标题:

    #ifndef Person_h
    #define Person_h
    
    class Person
    {
    private:
        char* name;
        char* adress; 
        char* phone;
    
    public:
        Person();
        Person(char const *name, char const *adress, char const *phone);
        Person(const Person &other);
        ~Person();
    
        void setName(char const *name);
        char* getName() const;
        void setAdress(char const *adress);
        char* getAdress() const;
        void setPhone(char const *phone);
        char* getPhone() const;
    };
    
    #endif // !Person_h
    

    问题开始了。为什么我应该使用字符指针而不是实际的字符变量?我猜这是一些节省内存或提高性能的约定?

    这是我们的教授编写代码的方式,试图让我们理解指针和 const

    下面是我对该类的实现:

    #include "Person.h"
    //Person.h class implementation
    
    Person::Person()
    {
        Person::name = new (char[64]);
        Person::adress = new (char[64]);
        Person::phone = new (char[64]);
    }
    
    Person::Person(const char *name, const char *adress , const char *phone)
    {
        Person::name = new (char[64]);
        Person::adress = new (char[64]);
        Person::phone = new (char[64]);
    
        setName(name);
        setAdress(adress);
        setPhone(phone);
    };
    
    Person::Person(Person const &other)
    {
        Person::name = new (char[64]);
        Person::adress = new (char[64]);
        Person::phone = new (char[64]);
    
        setName(other.getName);
        setAdress(other.getAdress);
        setPhone(other.getPhone);
    };
    
    Person::~Person()
    {
        delete [] name;
        delete [] adress;
        delete [] phone;
    };
    
    void Person::setName(const char *name)
    {
        this->name = name;
    };
    
    char* Person::getName() const
    {
        return name;
    };
    
    void Person::setAdress(char const *adress)
    {
        this->adress = adress;
    };
    
    char* Person::getAdress() const
    {
        return adress;
    };
    
    void Person::setPhone(char const *phone)
    {
        this->phone = phone;
    };
    
    char* Person::getPhone() const
    {
        return phone;
    };
    

    void Person::setName(const char *name)
    {
        this->name = name;    //error
    };
    

    “不能将“const char*”类型的值分配给“char*”类型的实体”

    那我为什么要用 常数 当我无法分配这些值时?或者,我如何“unconst”这些,而不使成员变量本身 常数

    这整件事现在对我来说只是一个很大的困惑。

    编辑:I 在我的考试中使用C字符串是为了理解指针和内存管理。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Mike Nakis    6 年前

    用外行的话说 this->name = name; name 是常量和 this->name 是非常量,是因为你的函数承诺 名称

    继续,用字符串替换字符指针。如果你那样做,你的老师可能会不高兴。

    char* 而不是 char[]

    • 一个原因是效率:如果有可能通过考试 字符[] 字符[] 需要复制到堆栈中。当你经过一个 ,您只复制指向字符的指针,通常是单个机器字。

    • 另一个原因是,这实际上是不可能的。编译器不知道您的 以零结尾,以便为其分配足够的堆栈空间并将其复制到堆栈。语言的创造者宁愿不把这种内在的知识放在语言中。相反,他们决定 字符[] 字符* ,这样您就可以从您的功能中作为 字符* 做你想做的事。

    • 另一个原因是如果你的 只是太大了一点,那么堆栈就会溢出。

    因此,出于所有这些原因,当我们想要传递比机器字大(或相当大)的类型的值时,我们不传递值本身,而是传递指针或对它们的引用。

        2
  •  2
  •   Some programmer dude    7 年前

    正在做,例如。

    this->name = name;
    

    存在问题的原因有两个:首先,因为您试图将一种类型的变量分配给一种密切相关但仍然不同的类型的变量。但这不是大问题。

    原始指针 this->name 另一个

    结果类似于

    int a = 5;
    int b = 10;
    a = b;
    

    然后想知道为什么 a 不再等于 5

    复制字符串 而不是分配指针。这是用 std::strcpy

    不过,我建议的解决方案是停止对字符串使用指针,而是使用标准C++ std::string 班那你呢 使用简单赋值复制字符串。它们还处理自己的内存,所以您不必担心内存泄漏、指针、释放无效指针或跟踪字符串的实际大小。

    这个 标准::字符串 String 标准::字符串 可以 直接将字符串与 == .

        3
  •  1
  •   PatrickF    7 年前

    在现代C++中,您应该仍然了解内存管理,但为了可读性、异常安全和bug,您应该使用容器,它可以作为std::string来完成这项工作。

    const char*name意味着你有一个指针,指向一个内存段,它本身就是const,这意味着这个内存段内的数据不应该改变。

    指针本身可以更改。

    分配时

    this->name = name;