以下程序的主要功能是:常对象调用常成员函数。请分析、阅读该程序,改正其中的错误之处。 #include <iostream> using namespace std; class C { private: const int x; public: C(int n) { x=n; cout<<"C类的构造函数被调用,x="<<x<<endl; } ~C() { cout<<"C类的析构函数被调用,x="<<x<<endl; } void display() { cout<<"x="<<x<<endl; } }; int main() { const C obj(100); obj.display(); return 0; }
时间: 2024-01-06 12:04:13 浏览: 28
程序的主要功能是创建一个常对象obj,并调用它的常成员函数display来输出对象的数据成员x的值。
程序中的错误在于,常对象只能调用常成员函数,而在C类中,display函数没有被声明为常成员函数,因此无法被常对象调用。应该将display函数声明为常成员函数,方法是在display函数后加上const关键字。
修改后的程序如下:
```
#include <iostream>
using namespace std;
class C {
private:
const int x;
public:
C(int n)
{
x=n;
cout<<"C类的构造函数被调用,x="<<x<<endl;
}
~C()
{
cout<<"C类的析构函数被调用,x="<<x<<endl;
}
void display() const // 常成员函数
{
cout<<"x="<<x<<endl;
}
};
int main() {
const C obj(100);
obj.display();
return 0;
}
```
相关问题
分析下列代码,改正其中的错误,使程序能正确运行: #include <iostream> using namespace std; class TV { public: void SetStation(int i); int GetStation(); private: int station; }; int main() { TV myTV; myTV.station=9; myTV.SetStation(10); TV myOtherTV(2);//创建一个对象,设置其频道数为2 } 在成员函数的定义中显式加入this指针,程序功能仍保持不变。
分析:
1. 在代码中,TV类中的station成员变量是私有的,无法在main函数中直接访问,因此在myTV.station=9;这一行代码中会出现错误。
2. 在main函数中创建对象时,只有一个参数,但是TV类中没有定义只有一个参数的构造函数。
3. 在调用SetStation函数时,没有明确指出要操作哪个对象的station成员变量,因此需要在成员函数中显式加入this指针来指示。
改正后的代码如下:
```
#include <iostream>
using namespace std;
class TV {
public:
void SetStation(int i);
int GetStation();
private:
int station;
};
void TV::SetStation(int i) {
this->station = i;
}
int TV::GetStation() {
return this->station;
}
int main() {
TV myTV;
myTV.SetStation(10);
TV myOtherTV;
myOtherTV.SetStation(2);
return 0;
}
```
在修改后的代码中,我们将myTV.station=9;改为了myTV.SetStation(10);,使用成员函数来设置对象的station成员变量;将TV类中的成员函数定义中显式加入this指针,指示要操作哪个对象的成员变量;将main函数中创建对象时的参数个数调整到与TV类中定义的构造函数参数个数一致。
改正下面程序的错误,请不要修改类名、类中数据成员名称、成员函数名称。 class circle { private: double radius; public: void set_radius(double r) { radius = r; } double comp_area() { return 3.14 * r * r; } } int main() { circle c1; double x, a; cout << "本程序已经创建了一个Circle对象,请您输入该对象的数据成员半径radius的值:" << endl; cin >> x; c1.set_radius(); a = c1.comp_area(); cout << "该Circle对象的面积为:" << setiosflags(ios::fixed) << setprecision(2) << a << endl; //输出要求小数点后必须保留2位有效数字(四舍五入),不足补零 return 0; }
修改后的程序如下:
```
#include <iostream>
#include <iomanip> //需要用到setprecision和setiosflags函数
using namespace std;
class circle {
private:
double radius;
public:
void set_radius(double r) { //修改函数参数
radius = r;
}
double comp_area() {
return 3.14 * radius * radius; //修改变量名
}
};
int main() {
circle c1;
double x, a;
cout << "本程序已经创建了一个Circle对象,请您输入该对象的数据成员半径radius的值:" << endl;
cin >> x;
c1.set_radius(x); //修正函数调用的参数
a = c1.comp_area();
cout << "该Circle对象的面积为:" << setiosflags(ios::fixed) << setprecision(2) << a << endl;
return 0;
}
```
修改点:
1. `comp_area` 函数中变量名 `r` 修改为 `radius`。
2. `set_radius` 函数的参数列表中添加一个 `double r` 参数,用于接收用户输入的半径值。
3. 在 `main` 函数中调用 `set_radius` 函数时,将用户输入的半径值作为参数传递给 `set_radius` 函数。
4. 修正 `set_radius` 函数调用时缺少参数的错误。
5. 在输出面积时,使用 `setiosflags(ios::fixed)` 指定输出格式为定点数,使用 `setprecision(2)` 指定输出小数点后保留两位有效数字。
阅读全文