#include <iostream> using namespace std; class MyClass { int val; public: MyClass(int i) { val = i; cout << "inside constructor \n"; } int getval() { return val; } ~MyClass() { cout << "Destructor\n"; } }; MyClass MkBigger(MyClass a) { MyClass o(a.getval() * 2); return o; } void display(MyClass ob) { cout << ob.getval() << endl; } void main() { MyClass a(10); cout << "Before calling display().\n"; display(a); a = MkBigger(a); cout << "after display returns.\n"; }这段代码的结果是什么
时间: 2024-02-04 12:02:44 浏览: 105
这段代码的结果输出如下:
inside constructor
Before calling display().
10
inside constructor
Destructor
after display returns.
Destructor
其中,输出的 "inside constructor" 是 MyClass 的构造函数被调用的标志,"Destructor" 是 MyClass 的析构函数被调用的标志。代码中首先创建了一个 MyClass 对象 a,然后调用了 display 函数,display 函数接受一个 MyClass 对象 ob 作为参数,将 ob 的 val 值输出到屏幕上。接着,调用了 MkBigger 函数,该函数接受一个 MyClass 对象 a 作为参数,并返回一个新的 MyClass 对象 o,该对象的 val 值是 a 的 val 值的两倍。在调用 MkBigger 函数时,会先调用一次 MyClass 的构造函数,创建一个临时对象,然后将这个临时对象作为参数传递给 MkBigger 函数。在 MkBigger 函数内部,又会创建一个新的 MyClass 对象 o,然后将这个对象作为返回值返回。在返回值时,会将 o 对象复制一份,即调用复制构造函数,然后将这个复制的对象作为返回值返回。最后,程序结束时会依次调用 a 和 o 对象的析构函数。
相关问题
#include <iostream> using namespace std; class MyClass { int* p; const int N; public: // ERROR **********found********** MyClass(int val) : N=1 { p = new int; *p = val; } // ERROR **********found********** ~MyClass() { delete *p; } friend void print(MyClass& obj); }; // ERROR **********found********** void MyClass::print(MyClass& obj) { cout << "value = " << *(obj.p) << endl; cout << "number = " << obj.N << endl; } int main() { MyClass obj(63); print(obj); return 0; }
在这段代码中,有三个错误:
1. 在 MyClass 类的构造函数中,使用了 const 成员初始化列表,但是 N 是一个非静态成员变量,不能在初始化列表中初始化。正确的做法是在构造函数的函数体中给 N 赋值。
2. 在 MyClass 类的析构函数中,使用了 delete *p,但是 p 是一个指向 int 的指针,应该使用 delete p。
3. 在 MyClass 类的友元函数 print() 中,应该将其定义为 MyClass 类的成员函数,而不是独立的函数。
下面是修改后的代码:
```cpp
#include <iostream>
using namespace std;
class MyClass {
int* p;
const int N;
public:
MyClass(int val) : N(1) {
p = new int;
*p = val;
}
~MyClass() { delete p; }
void print() {
cout << "value = " << *p << endl;
cout << "number = " << N << endl;
}
};
int main() {
MyClass obj(63);
obj.print();
return 0;
}
```
// proj31.cpp #include <iostream> using namespace std; class Member { // ERROR ********found******** private: Member(int val) : value(val) {} int value; }; class MyClass { Member _m; public: // ERROR ********found******** MyClass(int val) {} int GetValue() const { return _m.value; } }; int main() { MyClass *obj = new MyClass(10); // ERROR ********found******** 下列语句输出obj指向类中的value值 cout << "The value is: " << obj.GetValue() << endl; delete obj; return 0; }
这是一个 C++ 的程序,其中包含了一些错误(错误已被标注为 `ERROR ********found********`)。程序实现了两个类 `Member` 和 `MyClass`,并在 `main` 函数中创建了一个指向 `MyClass` 对象的指针 `obj`,然后输出了 `obj` 指向的对象的 `value` 值。但是程序中存在以下错误:
1. 在 `Member` 类的定义中,构造函数被声明为 `private`,这意味着无法从类外部创建 `Member` 类对象。如果需要在类外部创建 `Member` 类对象,需要将构造函数声明为 `public` 或者 `protected`。
2. 在 `MyClass` 类的定义中,构造函数没有初始化 `Member` 类的对象 `_m`,因此 `_m` 的值是未定义的。需要在 `MyClass` 的构造函数中初始化 `_m` 对象。
3. 在 `MyClass` 的构造函数中,没有将参数 `val` 传递给 `_m` 对象的构造函数,因此 `_m` 对象的值仍然是未定义的。需要在 `MyClass` 的构造函数中将参数 `val` 传递给 `_m` 对象的构造函数。
4. 在 `main` 函数中,创建 `MyClass` 对象的语法有误,应该使用 `new` 关键字创建动态对象,并将返回的指针赋值给 `obj`。
以下是修改后的程序:
```cpp
#include <iostream>
using namespace std;
class Member {
public:
Member(int val) : value(val) {}
int value;
};
class MyClass {
public:
MyClass(int val) : _m(val) {}
int GetValue() const { return _m.value; }
private:
Member _m;
};
int main() {
MyClass *obj = new MyClass(10);
cout << "The value is: " << obj->GetValue() << endl;
delete obj;
return 0;
}
```
阅读全文