Visual C++ 2008入门经典 第七章 自定义数据类型
// 第七章 自定义数据类型 // 没有该章ppt,只能直接按实例学习了 #include "stdafx.h" #include <iostream> using namespace std; using namespace System; //01自定义数据结构 /*struct RECTANGLE { int Left; int Top; int Right; int Bottom; }; //计算矩形的面积 long Area(RECTANGLE& aRect); void MoveRect(RECTANGLE& aRect, int x, int y); int main(array<System::String ^> ^args) { RECTANGLE Yard = {0, 0, 100, 120}; RECTANGLE Pool = {30, 40, 70, 80}; RECTANGLE Hut1, Hut2; Hut1.Left = 70; Hut1.Top = 10; Hut1.Right = Hut1.Left + 25; Hut1.Bottom = 30; Hut2 = Hut1; MoveRect(Hut2, 10, 90); cout<<"移动 Hut2后:"<<Hut2.Left<<", "<<Hut2.Top<<" AND "<<Hut2.Right<<", "<<Hut2.Bottom<<endl; cout<<"计算 Yard的面积是:"<<Area(Yard)<<endl; cout<<"计算poll的面积是:"<<Area(Pool)<<endl; system("pause"); return 0; } long Area(RECTANGLE& aRect) { return static_cast<long>((aRect.Right - aRect.Left) * (aRect.Bottom-aRect.Top)); //return 0.0; } //移动矩形 void MoveRect(RECTANGLE& aRect, int x, int y) { int length = aRect.Right - aRect.Left; int width = aRect.Bottom - aRect.Top; aRect.Left = x; aRect.Top = y; aRect.Right = x + length; aRect.Bottom = y + width; return; } */ //02 创建和使用类 /*class CBox { public: double m_Length; double m_Width; double m_Height; }; int main(array<System::String ^> ^args) { CBox box1; CBox box2; double boxVolume = 0.0; box1.m_Height =18.0; box1.m_Length = 78.0; box1.m_Width = 24.0; box2.m_Height = box1.m_Height - 10; //8.0 box2.m_Length = box1.m_Length / 2.0; //39 box2.m_Width = box1.m_Length * 0.25; //19.5 boxVolume = box1.m_Height * box1.m_Length*box1.m_Width; cout<<" Volume of box1 = "<<boxVolume<<endl; cout<<" box2 has sides which total "<<box2.m_Height + box2.m_Length + box2.m_Width<<endl; cout<<" A CBox object occupies "<<sizeof box1<<" bytes."<<endl; system("pause"); return 0; }*/ //03 一个成员函数的一个盒子的体积计算 /*class CBox { public: double m_Length; double m_Width; double m_Height; double Volume() { return m_Length * m_Width * m_Height; } }; int main(array<System::String ^> ^args) { CBox box1; CBox box2; double boxVolume = 0.0; box1.m_Height =18.0; box1.m_Length = 78.0; box1.m_Width = 24.0; box2.m_Height = box1.m_Height - 10; //8.0 box2.m_Length = box1.m_Length / 2.0; //39 box2.m_Width = box1.m_Length * 0.25; //19.5 boxVolume = box1.Volume(); cout<<" Volume of box1 = "<<boxVolume<<endl; cout<<" box2 has sides which total "<<box2.Volume()<<endl; cout<<" A CBox object occupies "<<sizeof box1<<" bytes."<<endl; system("pause"); return 0; }*/ //04 使用构造函数 /*class CBox { public: double m_Length; double m_Width; double m_Height; CBox(double lv, double bv, double hv) { m_Length = lv; m_Width = bv; m_Height = hv; } double Volume() { return m_Length * m_Width * m_Height; } }; int main(array<System::String ^> ^args) { CBox box1(78.0, 24.0, 18.0); CBox box2(8.0, 5.0, 1.0); double boxVolume = 0.0; boxVolume = box1.Volume(); cout<<"Volume of box1 = "<<boxVolume<<endl; cout<<"Volume of box2 = "<<box2.Volume()<<endl; system("pause"); return 0; }*/ //05 默认构造函数 /*class CBox { public: double m_Length; double m_Width; double m_Height; CBox(double lv, double bv, double hv) { cout<<"带三个参数的构造函数"<<endl; m_Length = lv; m_Width = bv; m_Height = hv; } CBox() { cout<<"默认构造函数"<<endl; } double Volume() { return m_Length * m_Width * m_Height; } }; int main(array<System::String ^> ^args) { CBox box1(78.0, 24.0, 18.0); CBox box2; CBox cigarBox(8.0, 5.0, 1.0); double boxVolume = 0.0; boxVolume = box1.Volume(); cout<<"Volume of box1 = "<<boxVolume<<endl; box2.m_Height = box1.m_Height - 10; box2.m_Length = box1.m_Length / 2.0; box2.m_Width = 0.25 * box1.m_Length; cout<<"Volume of box2 = "<<box2.Volume()<<endl; cout<<"Volume of cigarBox = "<<cigarBox.Volume()<<endl; system("pause"); return 0; }*/ //06 提供默认构造函数的参数值 /*class CBox { public: double m_Length; double m_Width; double m_Height; CBox(double lv=1.0, double bv=1.0, double hv=1.0) { cout<<"带三个参数的构造函数"<<endl; m_Length = lv; m_Width = bv; m_Height = hv; } double Volume() { return m_Length * m_Width * m_Height; } }; int main(array<System::String ^> ^args) { CBox box2; cout<<"Volume of box2 = "<<box2.Volume()<<endl; system("pause"); return 0; }*/ //07 类的私有成员 /*class CBox { public: CBox(double lv=1.0, double bv=1.0, double hv=1.0):m_Length(lv),m_Width(bv),m_Height(hv) { } double Volume() { return m_Length * m_Width * m_Height; } private: double m_Length; double m_Width; double m_Height; }; int main(array<System::String ^> ^args) { CBox box2; cout<<"Volume of box2 = "<<box2.Volume()<<endl; CBox match(2.2, 1.1, 0.5); cout<<"Volume of match = "<<match.Volume()<<endl; system("pause"); return 0; }*/ //08 创建一类的友元函数 /*class CBox { public: CBox(double lv=1.0, double bv=1.0, double hv=1.0):m_Length(lv),m_Width(bv),m_Height(hv) { } double Volume() { return m_Length * m_Width * m_Height; } private: double m_Length; double m_Width; double m_Height; friend double BoxSurface(CBox aBox); }; double BoxSurface(CBox aBox) { return 2.0 * (aBox.m_Length * aBox.m_Width + aBox.m_Length*aBox.m_Height + aBox.m_Height*aBox.m_Width); } int main(array<System::String ^> ^args) { CBox box2; cout<<"Volume of box2 = "<<box2.Volume()<<endl; cout<<"Surface area of box2 = "<<BoxSurface(box2)<<endl; CBox match(2.2, 1.1, 0.5); cout<<"Volume of match = "<<match.Volume()<<endl; cout<<"Surface area of match = "<<BoxSurface(match)<<endl; system("pause"); return 0; }*/ //09 初始化一个对象的对象相同的类 /*class CBox { public: CBox(double lv=1.0, double bv=1.0, double hv=1.0):m_Length(lv),m_Width(bv),m_Height(hv) { } double Volume() { return m_Length * m_Width * m_Height; } private: double m_Length; double m_Width; double m_Height; }; int main(array<System::String ^> ^args) { CBox box1(78.0, 24.0, 18.0); CBox box2 = box1; cout<<"box1 volume = "<<box1.Volume()<<endl; cout<<"box2 volume = "<<box2.Volume()<<endl; system("pause"); return 0; }*/ //10 使用指针 /*class CBox { public: CBox(double lv=1.0, double bv=1.0, double hv=1.0):m_Length(lv),m_Width(bv),m_Height(hv) { } double Volume() { return m_Length * m_Width * m_Height; } //如果当前类大于xBox类的值返回true int Compare(CBox xBox) { return this->Volume() > xBox.Volume(); } private: double m_Length; double m_Width; double m_Height; }; int main(array<System::String ^> ^args) { CBox box1(2.2, 1.1, 0.5); CBox box2(8.0, 5.0, 1.0); if(box1.Compare(box2)) { cout<<"box1 大于 box2"<<endl; }else{ cout<<"box1 小于 box2"<<endl; } system("pause"); return 0; }*/ // 11 使用数组类对象 /*class CBox { public: //CBox(double lv=1.0, double bv=1.0, double hv=1.0) //如果也像上面一样进默认值的话,那么跟下面的默认构造函数一样了 CBox(double lv, double bv=1.0, double hv=1.0) { m_Length = lv; m_Width = bv; m_Height = hv; } CBox() { m_Length = m_Width = m_Height = 1.0; } //返回值不能修改的 double Volume()const { return m_Length * m_Width * m_Height; } //如果当前类大于xBox类的值返回true int Compare(CBox xBox) { return this->Volume() > xBox.Volume(); } private: double m_Length; double m_Width; double m_Height; }; int main(array<System::String ^> ^args) { CBox boxes[5]; CBox cigar(8.0, 5.0, 1.0); cout<<"Volume of boxes[3] = "<<boxes[3].Volume()<<endl; cout<<"Volume of cigar = "<<cigar.Volume()<<endl; system("pause"); return 0; }*/ //12 使用静态数据成员的类 /*class CBox { public: static int ObjectCount; //CBox(double lv=1.0, double bv=1.0, double hv=1.0) //如果也像上面一样进默认值的话,那么跟下面的默认构造函数一样了 CBox(double lv, double bv=1.0, double hv=1.0) { m_Length = lv; m_Width = bv; m_Height = hv; ObjectCount++; } CBox() { m_Length = m_Width = m_Height = 1.0; ObjectCount++; } //返回值不能修改的 double Volume()const { return m_Length * m_Width * m_Height; } //如果当前类大于xBox类的值返回true int Compare(CBox xBox) { return this->Volume() > xBox.Volume(); } private: double m_Length; double m_Width; double m_Height; }; int CBox::ObjectCount = 0; int main(array<System::String ^> ^args) { CBox boxes[5]; CBox cigar(8.0, 5.0, 1.0); cout<<"Volume of boxes[3] = "<<boxes[3].Volume()<<endl; cout<<"boxes[3] CBox::ObjectCount = "<<CBox::ObjectCount<<endl; cout<<"Volume of cigar = "<<cigar.Volume()<<endl; cout<<"cigar CBox::ObjectCount = "<<cigar.ObjectCount<<endl; system("pause"); return 0; }*/ //13 行使间接成员访问运算符 /*class CBox { public: static int ObjectCount; //CBox(double lv=1.0, double bv=1.0, double hv=1.0) //如果也像上面一样进默认值的话,那么跟下面的默认构造函数一样了 CBox(double lv, double bv=1.0, double hv=1.0) { m_Length = lv; m_Width = bv; m_Height = hv; ObjectCount++; } CBox() { m_Length = m_Width = m_Height = 1.0; ObjectCount++; } //返回值不能修改的 double Volume()const { return m_Length * m_Width * m_Height; } //如果当前类大于xBox类的值返回true int Compare(CBox xBox) { return this->Volume() > xBox.Volume(); } private: double m_Length; double m_Width; double m_Height; }; int CBox::ObjectCount = 0; int main(array<System::String ^> ^args) { CBox boxes[5]; CBox match(2.2, 1.1, 0.5); CBox cigar(8.0, 5.0, 1.0); CBox* pB1 = &cigar; CBox* pB2 = 0; cout<<" Address of cigar is "<<pB1<<endl; cout<<" Volume of cigar is "<<pB1->Volume()<<endl; pB2 = &match; cout<<" Address of match is "<<pB2<<endl; cout<<" Volume of match is "<<pB2->Volume()<<endl; if(pB2->Compare(*pB1)){ cout<<"cigar 大于 match"<<endl; }else{ cout<<"cigar 小于 match"<<endl; } pB1 = boxes; boxes[2] = match; cout<<"Volume of boxes[2] is "<< (pB1 + 2)->Volume()<<endl; system("pause"); return 0; }*/ //14 定义和使用一个值类型 /*value class Height { private: int feet; int inches; public: Height(int ins) { feet = ins / 12; inches = ins % 12; } Height(int ft, int ins) : feet(ft), inches(ins){} }; int main(array<System::String ^> ^args) { Height myHeight = Height(6,3); Height^ yourHeight = Height(70); Height hisHeight = *yourHeight; Console::WriteLine(L"My height is {0}", myHeight); //这里咱出现的是类的名称,有点不清楚 Console::WriteLine(L"Your height is {0}", yourHeight); Console::WriteLine(L"his height is {0}", hisHeight); system("pause"); return 0; }*/ /*value class Height { private: int feet; int inches; public: Height(int ins) { feet = ins / 12; inches = ins % 12; } Height(int ft, int ins) : feet(ft), inches(ins){} virtual String^ ToString() override { return feet+L" feet "+ inches + L" inches"; } }; int main(array<System::String ^> ^args) { Height myHeight = Height(6,3); Height^ yourHeight = Height(70); Height hisHeight = *yourHeight; Console::WriteLine(L"My height is: {0}", myHeight); //这里咱出现的是类的名称,有点不清楚 Console::WriteLine(L"Your height is: {0}", yourHeight); Console::WriteLine(L"his height is: {0}", hisHeight); system("pause"); return 0; }*/ //15 使用Box引用类类型 /*ref class CBox { public: CBox(): m_Length(1.0), m_Width(1.0), m_Height(1.0) { Console::WriteLine(L"No-arg constructor called."); } CBox(double lv, double bv, double hv):m_Length(lv), m_Width(bv), m_Height(hv) { Console::WriteLine(L"Constructor called."); } double Volume() { return m_Length * m_Width * m_Height; } private: double m_Length; double m_Width; double m_Height; }; int main(array<System::String ^> ^args) { CBox^ aBox; CBox^ newBox = gcnew CBox(10, 15, 20); aBox = gcnew CBox; Console::WriteLine(L"Default box volume is {0}", aBox->Volume()); Console::WriteLine(L"New box volume is {0}", newBox->Volume()); system("pause"); return 0; }*/ //16 使用标量属性 /*value class Height { private: int feet; int inches; literal int inchesPerFoot = 12; literal double inchesToMeters = 2.54 / 100; public: Height(int ins) { feet = ins / inchesPerFoot; inches = ins % inchesPerFoot; } Height(int ft, int ins) : feet(ft), inches(ins){ } property double meters { double get() { return inchesToMeters * (feet * inchesPerFoot + inches); } } virtual String^ ToString() override { return feet + L" feet " + inches + L" inches ;"; } }; value class Weight { private: int lbs; int oz; literal int ouncesPerPound = 16; literal double lbsToKg = 1.0 / 2.2; public: Weight(int pounds, int ounces) { lbs = pounds; oz = ounces; } property int pounds { int get(){ return lbs;} void set(int value){ lbs = value; } } property int ounces { int get(){ return oz;} void set(int value){ oz = value;} } property double kilograms { double get(){ return lbsToKg*(lbs + oz/ouncesPerPound); } } virtual String^ ToString() override { return lbs + L" pounds " + oz + L" ounces "; } }; ref class Person { private: Height ht; Weight wt; public: property String^ Name; Person(String^ name, Height h, Weight w):ht(h),wt(w) { Name = name; } Height getHeight(){ return ht;} Weight getWeight(){ return wt;} }; int main(array<System::String ^> ^args) { Weight hisWeight = Weight(185, 7); Height hisHeight = Height(6, 3); Person^ him = gcnew Person(L"Fred", hisHeight, hisWeight); Weight herWeight = Weight(105, 3); Height herHeight = Height(5, 2); Person^ her = gcnew Person(L"Freda", herHeight, herWeight); Console::WriteLine(L"She is {0}", her->Name); Console::WriteLine(L"Her weight is {0:F2} kilograms.", her->getWeight().kilograms); Console::WriteLine(L"Her height is {0} which is {1:F2} meters.", her->getHeight(), her->getHeight().meters); Console::WriteLine(L"He is {0}", him->Name); Console::WriteLine(L"His weight is {0}.", him->getWeight()); Console::WriteLine(L"His height is {0} which is {1:F2} meters.", him->getHeight(), him->getHeight().meters); system("pause"); return 0; }*/ //17 默认的索引属性的定义和使用 /*ref class Name { private: array<String^>^ Names; public: Name(...array<String^>^ names) : Names(names){ } property int NameCount { int get(){ return Names->Length;} } property String^ default[int] { String^ get(int index) { if(index >= Names->Length) throw gcnew Exception(L"Index out of range"); return Names[index]; } } }; int main(array<System::String ^> ^args) { Name^ myName = gcnew Name(L"Ebenezer", L"Isaiah", L"Ezra", L"Inigo", L"Whelkwhistle"); for(int i=0; i< myName->NameCount; i++) { Console::WriteLine(L"Name {0} is {1}", i+1, myName[i]); } system("pause"); return 0; }*/ //17A 随着集索引属性的能力增加 ref class Name { private: array<String^>^ Names; public: Name(...array<String^>^ names) : Names(names){ } property int NameCount { int get(){ return Names->Length;} } property String^ default[int] { String^ get(int index) { if(index >= Names->Length) throw gcnew Exception(L"Index out of range"); return Names[index]; } void set(int index, String^ name) { if(index >= Names->Length) throw gcnew Exception(L"Index out of range"); Names[index] = name; } } property wchar_t Initials[int] { wchar_t get(int index) { if(index >= Names->Length) throw gcnew Exception(L"Index out of range"); return Names[index][0]; } } }; int main(array<System::String ^> ^args) { Name^ myName = gcnew Name(L"Ebenezer", L"Isaiah", L"Ezra", L"Inigo", L"Whelkwhistle"); myName[myName->NameCount - 1] = L"Oberwurst"; //修改最后一个值 这里应该是重载函数 for(int i=0; i< myName->NameCount; i++) { Console::WriteLine(L"Name {0} is {1}", i+1, myName[i]); } Console::Write(L"The initials are:"); for(int i=0; i<myName->NameCount; i++) { Console::Write(L" {0}", myName->Initials[i]); } Console::WriteLine(); system("pause"); return 0; } /*int main(array<System::String ^> ^args) { Console::WriteLine(L"Hello World"); return 0; }*/