您的位置:首页 > 编程语言 > C语言/C++

Visual C++ 2008入门经典 第七章 自定义数据类型

2012-10-28 23:33 246 查看
// 第七章 自定义数据类型
// 没有该章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;
}*/


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: