默认构造函数中的数组地址相同,但打印时却不同

问题描述 投票:0回答:1
#include<iostream>
#include<string.h>
using namespace std;
class Student{
    int age;
    
    public:
    char *name;
    
    
    
    Student(int age,char *name){
        this->age = age;
        
        this->name = new char[strlen(name) + 1];
        strcpy(this->name,name);

    }
    void display(){
        cout<<this->age<<" "<<this->name<<endl;
    }
};

int main(){
    char name[] = "abcd";
    Student s1(20,name); 
    Student s2(s1);
    s2.name[0] = 'e';
    //s2.name = "abdd";
    cout<<&name<<endl;
    cout<<&s1.name<<endl;
    cout<<&s2.name<<endl;
    s1.display();
    s2.display();
}

输出:-

0x61ff0b
0x61ff04
0x61fefc
20 ebcd
20 ebcd

为什么s1.name和s2.name的地址不同并且s2.name的变化仍然影响s1.name??

c++ class oop data-structures constructor
1个回答
0
投票

您正在打印指针变量的地址而不是指针本身的值。

我们可以将您的示例简化为:

char name1[] = "abcd";
char* name2 = name1;
std::cout << &name1 << "\n";
std::cout << &name2 << "\n";

这将打印两个不同变量的两个不同地址,但我们仍然只有一个数组。

如果要打印数组的地址,则需要转换为

void*
,因为流运算符在传递
char*
:

时会故意打印以 null 结尾的字符串的内容
std::cout << static_cast<void*>(name1) << "\n";
std::cout << startic_cast<void*>(name2) << "\n";

要修复代码,您需要实现复制构造函数、赋值运算符和析构函数,请参阅 什么是三法则? 或者更简单地使用

std::string
它会为您完成所有这些工作。

© www.soinside.com 2019 - 2024. All rights reserved.