c++中类的调用问题


#define _CRT_SECURE_WARNINGS
#include 
#include 
using namespace std;//标准命名空间

class student {
public:
    void setname(string Name) {
        name = Name;    
    }
    void setId(int id) {
        id = id;
    }
    void print(){
        cout <<"姓名:" << name <<"\n学号:" << id<private:
    string name;
    int id;
};

int main() {

    student s1;
    s1.setname("张三");
    s1.setId(10);
    s1.print();
    system("pause");
    return EXIT_SUCCESS;

}

在学生类中 调用print方法 输出id值为-858993460 这是什么问题

  • 类的id属性 跟你的入参是同名的,你需要指定this->id
  • 类中的变量引用,建议都加上 this->类的变量,不管其中入参或定义变量 与它同不同名, 就都没问题了
this->id = id;

img

你的代码中存在一个命名冲突:变量“id”和函数“setId”的名称相同。
为了避免这种情况,可以将函数“setId”中的“id”参数命名为“newId”等。
具体修改如下:

void setId(int newId) {
id = newId;
}
```c++


```

id = id;
自己赋值给自己呀
改为this.id=id
另,最好在构造函数里传2个参数赋值给属性,否则容易new完忘记给属性赋值,这不是好习惯

以后所有的赋值方法,建议都要加上 this 指针:

this->id = id;

不管是C++, Java等等,养成一个良好的习惯,可以避免犯这种容易忽略的错误

问题出在student类中的setId函数中的参数命名和成员变量命名相同,这造成了局部变量的覆盖。为了避免这个问题,可以使用"this"指针,将其作为成员变量的引用。

以下是修改后的代码:

#define _CRT_SECURE_WARNINGS
#include <iostream>
#include <string>
using namespace std;//标准命名空间
 
class student {
public:
    void setname(string Name) {
        name = Name;    
    }
    void setId(int ID) {
        id = ID;
    }
    void print(){
        cout <<"姓名:" << name <<"\n学号:" << id<<endl;
 
    }
private:
    string name;
    int id;
};
 
int main() {
 
    student s1;
    s1.setname("张三");
    s1.setId(10);
    s1.print();
    system("pause");
    return EXIT_SUCCESS;
 
}


在上面的代码中,我们使用了一个不同的参数名称"ID",而不是成员变量"id",这样就避免了变量名冲突的问题。

应该是this->id = id,两个id 重名了,修改如下


#include <iostream>
#include <string>
using namespace std;//标准命名空间

class student {
public:
    void setname(string Name) {
        name = Name;
    }
    void setId(int id) {
        this->id = id;
    }
    void print(){
        cout <<"姓名:" << name <<"\n学号:" << id<<endl;

    }
private:
    string name;
    int id;
};
int main() {
    student s1;
    s1.setname("张三");
    s1.setId(10);
    s1.print();
    return EXIT_SUCCESS;
}