Visual C++ .NET/Class/ref class
Содержание
class, ref class, value class
<source lang="csharp">
- include "stdafx.h"
using namespace System; class ClassMember {}; ref class RefClassMember {}; value class ValueClassMember {}; class Class { public:
ValueClassMember vc; ValueClassMember *pvc; ClassMember c; ClassMember *pc; int x; void write() { Console::WriteLine("Class x: {0}", x); }
}; ref class RefClass { public:
RefClassMember rc; RefClassMember ^hrc; ValueClassMember vc; ValueClassMember ^hvc; ValueClassMember *pvc; ClassMember *pc; int x; void write() { Console::WriteLine("RefClass x: {0}", x); }
}; value class ValueClass { public:
RefClassMember ^hrc; ValueClassMember vc; ValueClassMember ^hvc; ValueClassMember *pvc; ClassMember *pc; int x; void write() { Console::WriteLine("ValueClass x: {0}", x); }
};
class ClassChildClassParent : public Class {}; ref class RefClassChildRefClassParent : public RefClass {};
void main() {
Class _class; RefClass refclass; ValueClass valueclass; RefClass ^hrefclass = gcnew RefClass(); ValueClass ^hvalueclass = gcnew ValueClass(); Class *pclass = new Class(); ValueClass *pvalueclass = & valueclass; Class &rfclass = *new Class(); ValueClass &rfvalueclass = valueclass; _class.x = 1; refclass.x = 1; valueclass.x = 1; hrefclass->x = 1; hvalueclass->x = 1; pclass->x = 1; pvalueclass->x = 1; rfclass.x = 1; rfvalueclass.x = 1; _class.write(); refclass.write(); valueclass.write(); hrefclass->write(); hvalueclass->write(); pclass->write(); pvalueclass->write(); rfclass.write(); rfvalueclass.write();
}
</source>
ref class demo
<source lang="csharp">
- include "stdafx.h"
using namespace System; public ref class MyClass { public:
MyClass(String^ name, int age) { Name = name; Age = age; } MyClass(MyClass% myClass) { *this = myClass; } virtual String^ ToString() override { return String::Format("{0}"s Age is {1}", Name, Age); } void operator = (MyClass% myClass) { Name = myClass.Name; Age = myClass.Age; }
private:
String^ Name; int Age;
};
void myFunc(MyClass param) {
Console::WriteLine(%param);
} void main() {
MyClass myClass1("M", 30); MyClass myClass2("V", 8); myFunc(myClass1); myClass1 = myClass2; Console::WriteLine(%myClass1); MyClass^ myClass3 = %myClass2; MyClass myClass4 = *myClass3; MyClass% myClass5 = myClass4;
}
</source>
ref class with member string variable
<source lang="csharp">
- include "stdafx.h"
using namespace System; ref class Hello {
String^ greeting; public: void Greet() { Console::WriteLine(greeting + "!"); } void SetGreeting(String^ newGreeting) { greeting = newGreeting; }
}; int main() {
Hello^ hello = gcnew Hello(); hello->SetGreeting("Hello World"); hello->Greet(); hello->SetGreeting("Howdy"); hello->Greet();
}
</source>
Reference and Indirection
<source lang="csharp">
- include "stdafx.h"
using namespace System; ref class RefClass { public:
int X; RefClass(int x) { X = x; }
};
void main() {
RefClass rc(10); RefClass ^o; o = %rc; Console::WriteLine(o->X); rc.X = 20; Console::WriteLine(o->X); int %i = rc.X; i = 30; Console::WriteLine(o->X);
}
</source>
ref type
<source lang="csharp">
- include "stdafx.h"
using namespace System; ref class RefType {
String^ classname; public: RefType() { classname = gcnew String("RefType"); } String^ GetMessage() { return String::Format("I am a " + classname); }
}; int main() {
RefType^ r = gcnew RefType(); Console::WriteLine(r->GetMessage());
}
</source>
Stack References
<source lang="csharp">
- include "stdafx.h"
using namespace System; ref class Square { public:
int Area() { return d * d; } int d;
}; void main() {
Square ^sqr1 = gcnew Square(); sqr1->d = 2; Console::WriteLine( sqr1->Area() ); Square sqr2; sqr2.d = 3; Console::WriteLine( sqr2.Area() );
}
</source>