C++;函数中的常量参数 我继续用C++学习UNI,我遇到了一些关于指针、const参数和所有基本实现类的重要理解问题(在java中与C++相比,这非常容易) 我通常使用java,所以C++对我来说是很新的。p>

C++;函数中的常量参数 我继续用C++学习UNI,我遇到了一些关于指针、const参数和所有基本实现类的重要理解问题(在java中与C++相比,这非常容易) 我通常使用java,所以C++对我来说是很新的。p>,c++,class,pointers,constants,getter-setter,C++,Class,Pointers,Constants,Getter Setter,这是我对类“Person”的简单标题: 问题开始了。为什么我应该使用字符指针而不是实际的字符变量?我猜这是为了节省内存还是为了提高性能 这是我们的教授编写代码的方式,试图让我们理解指针和常量的用法 下面是我对该类的实现: #include "Person.h" //Person.h class implementation Person::Person() { Person::name = new (char[64]); Person::adress = new (char[6

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

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

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

下面是我对该类的实现:

#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;
};
我们应该学会手动将内存分配给元素,并尝试进行总体内存管理。因此,对setter函数使用const参数。我猜这是为了不改变元素参数?我很困惑,基本上

而my IDE(MS VisualStudio 2015)则将以下行作为错误下划线:

void Person::setName(const char *name)
{
    this->name = name;    //error
};
“不能将“const char*”类型的值分配给“char*”类型的实体”

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

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

编辑:我必须在考试中使用C字串,这是为了理解指针和内存管理,参考我们的教授所做的,例如

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

最大的问题是,您试图用另一个指针(指向其他地方)重新分配原始指针
this->name
(指向已分配的内存)

结果与实验结果相似

int a = 5;
int b = 10;
a = b;
然后想知道为什么
a
不再等于
5

这里有两种解决方案:第一种是继续使用指针,然后复制字符串而不是分配指针。这是通过函数完成的

我推荐的解决方案是停止使用字符串指针,而使用标准C++类。然后可以使用简单赋值来复制字符串。它们还处理自己的内存,所以您不必担心内存泄漏、指针、释放无效指针或跟踪字符串的实际大小

<> >代码> STD::String C++类与java String 类有一些相似之处,因此如果你来自java背景,你不难调整。不同的是,在C++中使用<代码> STD::String >你可以直接比较字符串与<代码> = = .< /P> < P> >

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

最大的问题是,您试图用另一个指针(指向其他地方)重新分配原始指针
this->name
(指向已分配的内存)

结果与实验结果相似

int a = 5;
int b = 10;
a = b;
然后想知道为什么
a
不再等于
5

这里有两种解决方案:第一种是继续使用指针,然后复制字符串而不是分配指针。这是通过函数完成的

我推荐的解决方案是停止使用字符串指针,而使用标准C++类。然后可以使用简单赋值来复制字符串。它们还处理自己的内存,所以您不必担心内存泄漏、指针、释放无效指针或跟踪字符串的实际大小


<> >代码> STD::String C++类与java String 类有一些相似之处,因此如果你来自java背景,你不难调整。最大的不同在于C++中使用的代码> STD::String 你可以直接与== .< /P> < P>在现代C++中进行比较,你应该仍然知道内存管理,但是为了可读性、异常安全性和错误,你应该使用那些为你工作的康泰斯,作为STD::String。 const char*name意味着你有一个指针,指向一个内存段,它本身就是const,这意味着这个内存段中的数据不应该改变

指针本身可以更改

当你分配

this->name = name;
您只是将指针this->name分配给name的指针。但这只能在指针为可转换类型时执行。如果您将这个->名称的类型从char*改为const char*,编译器就不会抱怨了


<>但是在你分配新东西之前,你应该清理内存,例如在现代C++中删除[]-No.< /P> < P>。你应该仍然知道内存管理,但是为了可读性、异常安全性和错误,你应该使用那些为你工作的康泰斯,作为STD::String。 const char*name意味着你有一个指针,指向一个内存段,它本身就是const,这意味着这个内存段中的数据不应该改变

指针本身可以更改

当你分配

this->name = name;
您只是将指针this->name分配给name的指针。但这只能在指针为可转换类型时执行。如果您将这个->名称的类型从char*改为const char*,编译器就不会抱怨了


但是在分配新的内容之前,您应该清理内存,例如,用外行的话说,删除[]this->name

,原因是
this->name=namename
为co时,code>不起作用