C++学习笔记----------类和对象(三大特性之一)
类和对象是C++语言区别与C语言的第一个特性,对于新接触C++语言的小白来说至关重要。
1.简论:
实验1:
设计一个圆类Circle,该类有数据成员圆心坐标(x,y)、半径r,同时具有以下功能:
(1)初始化圆心坐标和半径
(2)显示圆心坐标和半径
(3)计算圆面积
在主函数中,定义对象来测试该类的声明。
#include<iostream> using namespace std; class Circle { private: int x,y,r; double s; public: void init(int xx,int yy,int rr)//初始化,赋值init。 { x=xx; y=yy; r=rr; } void print()//输出 圆心(2,2),半径3。 { cout<<"圆心("<<x<<","<<y<<"),半径"<<r<<endl; } double area()//计算圆面积,不是输出。 { return 3.14*r*r; } }; int main() { Circle c1; //测试。 c1.init(2,2,3);//初始化函数必须放在最开始的位置。 c1.print(); cout<<c1.area()<<endl; system("pause"); return 0; }
实验2:
设计一个长方体类Box。该类有数据成员包含length(长)、width(宽)、high(高)。要求用成员函数实现以下功能:
(1)初始化长方体的长、宽、高;
(2)计算长方体的体积;
(3)显示长方体的长、宽、高。
在主函数中,定义对象来测试该类的声明。
#include<iostream> using namespace std; class Box { private: int x,y,z,v; public: void init(int xx,int yy,int zz)//初始化,赋值init。 { x=xx; y=yy; z=zz; } void print()//输出长方体的长宽高。 { cout<<"长:"<<x<<"宽:"<<y<<"高:"<<z<<endl; } double volume()//计算长方体的体积,不是输出。 { return x*y*z; } }; int main() { Box c1; //测试。 c1.init(2,2,3);//初始化函数必须放在最开始的位置。 c1.print(); cout<<c1.volume()<<endl; system("pause"); return 0; }
2.构造与析构函数+对象数组与对象指针:
3.对象的动态建立,释放及赋值,复制+静态成员函数:
实验3:
构造函数及析构函数在对象作用时的调用情况分析:
#include<iostream> using namespace std; class Circle { private: int x,y,r; public: Circle(int x,int y,int r) { this->x=x; this->y=y; this->r=r; cout<<"调用了有参构造函数"<<r<<'\t'; } Circle() { x=0; y=0; r=0; cout<<"调用了无参构造函数"<<r<<'\t'; } Circle(Circle &c) { this->x =c.x; this->y=c.y; this->r =c.r; cout<<"调用了复制构造函数"<<r<<'\t'; } ~Circle() { cout<<"调用了析构函数"<<r<<'\t'; } }; int main() { Circle c1; cout<<endl<<endl; Circle c2(1,1,1); cout<<endl<<endl; Circle *pc1=new Circle; cout<<endl<<endl; Circle *pc2=new Circle(); cout<<endl<<endl; Circle *pc3=new Circle(3,3,3); cout<<endl<<endl; Circle *pc4=new Circle[3]; cout<<endl<<endl; Circle c3; c3=c2; Circle c4(c3); cout<<endl<<endl; delete pc1; cout<<endl<<endl; delete pc2; cout<<endl<<endl; delete pc3; cout<<endl<<endl; delete []pc4; cout<<endl<<endl; return 0; }
4.友元函数与有元类:
实验4:
声明复数Complex类,该类有两个数据成员实部real,虚部imag。该类有以下函数:
(1)用于初始化实部、虚部的构造函数;
(2)实现2个复数加法运算的add(Complex )函数,用类的成员函数实现;
(3)实现2个复数减法运算的sub(Complex,Complex)函数,用友元函数实现;
在主函数中,定义对象来测试该类的声明。
#include<iostream> using namespace std; class Complex { private: int real,imag; public: Complex (int r,int i){real=r;imag=i;}//有参 Complex (){real=0,imag=0;}//无参 Complex add(Complex c2)//c3=c1+c2 { Complex c; c.real=this->real+c2.real ; c.imag=this->imag+c2.imag; return c; } friend Complex sub(Complex c1,Complex c2)//c4=c1-c2 { Complex t=Complex(c1.real-c2.imag,c1.real-c2.imag ); return t; } void print()//a+bi { cout<<real; if(imag>=0) cout<<"+"; cout<<imag<<"i"<<endl; } }; int main() { Complex c1(1,1),c2(2,2),c3,c4,*t; t=new Complex; *t=sub(c1,c2); t->print(); c3=c1.add(c2);//c3=c1+c2 c4=sub(c1,c2);//c4=c1-c2 c3.print (); c4.print (); cout<<endl; system("pause"); return 0; }
下面我们来做一个类和对象的综合应用的实验来结束这一特性的阐述:
4000
实验5:
设计一个日期Date类,私有成员年(year),月(month),日(Day)。实现以下功能:
(1)计算一个日期后多少天的日期,如2018年5月1日后5天是2018年5月6日
(2)计算两个日期间相差多少天,如2018年5月1日与2018年6月2日间相差32天。
在主函数中,定义对象来测试该类的声明。
#include <iostream> #include<math.h> using namespace std; class Date { private: int year,month,day; int isLeapYear(); int isLeapYear(int year); int isEndOfMonth(); void addOneDay(); int calculateDays(); public: Date(int y,int m,int d); Date(); void print(); Date addDays(int days); friend Date addDays(Date d,int days); friend int daysOf2Date(Date d1,Date d2); int daysOf2Date(Date d2); }; int Date::calculateDays()//2019.4.23 1900.1.1 d2.calculateDays(); { int days=0; days=(year-1900)*365;//年119*365 +1+1 for(int y=1900;y<year;y++){ if(isLeapYear(y)){days++;}} switch(month)//2019.10.23 1900.1.1 { case 12:days=days+30;//11月的天数 case 11:days=days+31;//10月的天数 case 10:days=days+30;//9月的天数 case 9:days=days+31;//8月的天数 case 8:days=days+31;//7月的天数 case 7:days=days+30;//6月的天数 case 6:days=days+31;//5月的天数 case 5:days=days+30;//4月的天数 case 4:days=days+31;//3月的天数 case 3:{if(isLeapYear()){days=days+29;}else {days=days+28;}}//2月的天数 case 2:days=days+31;//1月的天数 }//月4-1=3 31+29/28+31 days=days+day-1;//日 23-1 return days; } void Date::addOneDay() { if(isEndOfMonth()==1) { if(month==12){year++;month=1;day=1;} else{month++;day=1;} } else{day++;} } int Date::isEndOfMonth() { switch(month) { case 4:return day==30; case 6:return day==30; case 9:return day==30; case 11:return day==30; case 2: { if(isLeapYear()==1){return day==29;} else{return day==28;} } default:return day==31; } } int Date::isLeapYear() { if((year%400==0)||(year%4==0&&year%100!=0)){return 1;} else{return 0;} } int Date::isLeapYear(int year) { if((year%400==0)||(year%4==0&&year%100!=0)){return 1;} else{return 0;} } void Date::print() { cout<<year<<"-"<<month<<"-"<<day<<endl; } Date::Date() { year=1900; month=1; day=1; } Date::Date(int y,int m,int d) { year=y; month=m; day=d; } Date Date::addDays(int days) { Date d=*this;//Date d=d1; for(int i=1;i<=days;++i) { d.addOneDay(); } return d; } Date addDays(Date dd1,int days) { Date d=dd1; for(int i=1;i<=days;++i) { d.addOneDay(); } return d; } int daysOf2Date(Date d1,Date d2) { int days1=d1.calculateDays(); int days2=d2.calculateDays(); int days=abs(days1-days2);//abs(); return days; } int Date::daysOf2Date(Date d2) { Date d1=*this; int days1=d1.calculateDays(); int days2=d2.calculateDays(); int days=abs(days1-days2); return days; } int main() { Date d1(2019,5,1); Date d2=d1.addDays(5);//this指向d1; d2.print(); Date d5=addDays(d1,28); Date d3(2019,5,1),d4(2019,6,2); int days=daysOf2Date(d3,d4); cout<<days<<endl; return 0; }
- 学习笔记之深入浅出MFC 第8章 C++重要特性---类与对象大解剖(虚拟函数的实现方式)
- C++学习笔记—OOP三大特性之继承
- Objective-C基础学习笔记(三)-面向对象的三大特性之封装-set方法-get方法-类方法与对象方法
- C++学习笔记之类于对象
- 【学习笔记】C++高级程序设计:STL:函数对象
- Objective-C基础学习笔记(五)-面向对象的三大特性之多态
- 《Java编程思想》学习笔记2——对象初始化和面向对象特性
- C++中的vector容器对象学习笔记
- C++学习笔记-const对象,类型别名,auto和decltype
- IOS开发学习笔记010-面向对象的三大特性
- 【C++】学习笔记草稿版12(类对象的类型转换)
- C++之面向对象学习笔记
- C++的学习笔记(第七章:类与对象)
- C++ 对象模型 学习笔记(1)
- Objective-C基础学习笔记(四)-面向对象的三大特性之继承
- 面向对象非常非常重要的一个特性“多态”的学习笔记
- C++学习笔记5:从方法到属性(面向对象基础)
- C++使用构造函数初始化结构对象学习笔记
- javascript 学习笔记 三大特性
- JNI学习笔记 C++传递结构体、String、数组对象给JavaC++传递结构体、String、数组对象给Java