利用VS2008学习谭浩强教授的《C++面向对象程序设计》,记录自己的学习历程。
1 熟悉面向对象思想,编写class,理解成员函数和成员变量的调用
#include "stdafx.h"
#include<iostream>
using namespace std;
class Time
{
public:
void set_time();
void show_time();
private:
int hour;
int minute;
int sec;
};
int _tmain(int argc, _TCHAR* argv[])
{
Time t1;
t1.set_time();
t1.show_time();
return 0;
}
void Time::set_time()
{
cin>>hour;
cin>>minute;
cin>>sec;
}
void Time::show_time()
{
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
2 编写一个类,找出整型数组中元素的最大值
#include "stdafx.h"
#include <iostream>
using namespace std;
class Array
{
public:
void set_array();
int max_array();
private:
int array[10];
int max;
};
void Array::set_array()
{
for(int i=0;i<10;i++)
{
cin>>array[i];
}
}
int Array::max_array()
{
max=array[0];
for(int i=1;i<10;i++)
{
if(array[i]>max)
max=array[i];
}
return max;
}
int _tmain(int argc, _TCHAR* argv[])
{
Array aa;
int max_array;
aa.set_array();
max_array=aa.max_array();
cout<<"max="<<max_array<<endl;
return 0;
}
3 函数模板实现函数重载
#include "stdafx.h"
#include<iostream>
using namespace std;
template<typename T>
T max(T a,T b,T c)
{
if(a<b)
a=b;
if(a<c)
a=c;
return a;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i,i1=8,i2=98,i3=32;
double d,d1=39.3,d2=987.244,d3=83.987;
i=max(i1,i2,i3);
d=max(d1,d2,d3);
cout<<"整型最大值max="<<i<<endl;
cout<<"实型最大值max="<<d<<endl;
return 0;
}
4 有参和无参构造函数的调用
#include<iostream.h>
class point
{
public:
point(int x,int y)
{
cout<<"有参构造函数的调用:"<<endl;
xPos=x;
yPos=y;
}
point()
{
cout<<"无参构造函数的调用:"<<endl;
xPos=0;
yPos=0;
}
void print()
{
cout<<"xPos: "<<xPos<<",yPos: "<<yPos<<endl;
}
private:
int xPos;
int yPos;
};
int main()
{
point p1(7,19);
p1.print();
point p2;
p2.print();
return 0;
}
5 计算数组中元素的平均值及元素最大值和最小值
#include<iostream.h>
int main()
{
int array[10];
cout<<"请输入10个整型数组元素:"<<endl;
for(int i=0;i<10;i++)
{
cin>>array[i];
}
int sum=0;
float aver;
int max=array[0],min=array[0];
for(int j=0;j<10;j++)
{
sum+=array[j];
if(array[j]>max)
max=array[j];
if(array[j]<min)
min=array[j];
}
aver=sum/10.0;
cout<<"数组平均值为:"<<aver<<endl;
cout<<"数组最大值为:"<<max<<endl;
cout<<"数组最小值为:"<<min<<endl;
return 0;
}
6 字符串get()和getline()函数
#include<iostream.h>
int main()
{
char name[16];
char school[50];
cout<<"请输入你的姓名:"<<endl;
cin.get(name,16); //get函数读取一串字符
cin.get(); // 从输入流中提取换行符,否则下面的getline()函数无法正确执行
cout<<"请输入你所在的学校名:"<<endl;
cin.getline(school,50);
cout<<"你的名字是:"<<name<<endl;
cout<<"你在这所学校:"<<school<<endl;
return 0;
}
7 数组和指针
#include<iostream.h>
int main()
{
int sz[5];
for(int i=0;i<5;i++)
sz[i]=i;
cout<<"sz: "<<sz<<endl;
cout<<"&sz[0]: "<<&sz[0]<<endl;
cout<<"*sz: "<<*sz<<endl;
cout<<"*(sz+3): "<<*(sz+3)<<endl;
return 0;
}
8 用析构函数实现对象动态内存的释放
#include<iostream.h>
#include<string.h>
class Computer
{
public:
Computer(const char *sz,float p)
{
brand=new char[strlen(sz)+1];
strcpy(brand,sz);
price=p;
}
~Computer()
{
delete [] brand;
cout<<"清理现场"<<endl;
}
void print()
{
cout<<"品牌:"<<brand<<endl;
cout<<"价格:"<<price<<endl;
}
private:
char *brand;
float price;
};
int main()
{
Computer com("Dell",5000);
com.print();
return 0;
}
9 用指针数组处理字符串
#include<iostream.h>
int main()
{
char *ptr[]={"zero","one","two","three","four","five"};
int xInputs;
cout<<"请输入一个0到5(包括0和5的数): "<<endl;
cin>>xInputs;
cout<<"英语:"<<*(ptr+xInputs)<<endl;
return 0;
}
10 如果类中含有指针型的数据成员,需要使用动态内存,程序员最好显式地定义自己的复制构造函数,避免可能出现的各种内存错误
#include<iostream.h>
#include<string.h>
class computer
{
private:
char *brand;
float price;
public:
computer(const char *sz,float p)
{
brand=new char[strlen(sz)+1];
strcpy(brand,sz);
price=p;
}
computer(const computer& cp) //自定义复制构造函数
{
brand=new char[strlen(cp.brand)+1];
strcpy(brand,cp.brand);
price=cp.price;
}
~computer()
{
delete[] brand;
cout<<"清理现场"<<endl;
}
void print()
{
cout<<"品牌:"<<brand<<endl;
cout<<"价格:"<<price<<endl;
}
};
int main()
{
computer comp1("Dell",6000);
comp1.print();
computer comp2(comp1);
comp2.print();
return 0;
}
11 类对象成员
类数据成员也可以是另一个类的对象
#include<iostream.h>
class point
{
public:
int xpos;
int ypos;
public:
point(int x=0,int y=0)
{
cout<<"点的构造函数被执行"<<endl;
xpos=x;
ypos=y;
}
point(const point& pt)
{
cout<<"点的复制构造函数被执行"<<endl;
xpos=pt.xpos;
ypos=pt.ypos;
}
void print()
{
cout<<"( "<<xpos<<", "<<ypos<<")";
}
};
class line
{
private:
point pt1;
point pt2;
public:
line(int x1,int y1,int x2,int y2):pt1(x1,y1),pt2(x2,y2)
{
cout<<"线的构造函数被执行"<<endl;
}
line(const line& l1):pt1(l1.pt1),pt2(l1.pt2)
{
cout<<"线的复制构造函数被执行"<<endl;
}
void draw()
{
pt1.print();
cout<<" to ";
pt2.print();
cout<<endl;
}
};
int main()
{
line l1(1,2,3,4);
l1.draw();
line l2(l1);
l2.draw();
return 0;
}