解决了vs2010闪退问题:按ctrl+F5运行/在程序后面加断点运行。(时间紧时候,会让人更加高效集中在最紧急的事情上,所以谢谢那些让我忙碌的人。)
终于成功的把这个快捷键加入到菜单栏了。
类的声明和对象的定义
类是对象的抽象,不占用内存;对象是类的具体,占用存储空间。如同结构体一样,先声明类,再定义类。
按结构体发展而来;
异同之处:便于继承c的结构体,使其具有了类的特点;结构体类:默认为public,class类则为private;尽量使用class建类。类中无成员函数等同于结构体。
example1:
class Student//The first letter is capitalized
{
//private default
public:
void display( )//member function
{cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
private:
int num;
char name[20];//an array of 20 member, the name represent the whole content.
char sex;
};//;is a must
Student stu1,stu2;//类的defination 先声明,再定义。建议用。
class Student//The first letter is capitalized
{
//private default
public:
void display( )//member function
{cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
private:
int num;
char name[20];//an array of 20 member, the name represent the whole content.
char sex;
}stu1,stu2;//声明同时,定义对象。 简单小程序用。
类的成员函数
类函数:函数的一种。包括返回值和函数类型。区别:只出现在类体内。需注意调用的权限及作用域。可以访问本类内所有成员,包括私有和公有。
Example 1 成员函数是在类内定义的;也可以类内声明,类外定义。一种良好编程习惯。
Example 2
class Student
{
public:
void display( );// statement成员函数声明
private:
int num;
char name[20];//an array of 20 member, the name represent the whole content.
char sex;
};
void Student:: display( )//void display( )正常函数声明中间嵌入作用域限定符(类 而非 对象)
{cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
Student stu1,stu2;
inline成员函数
内置函数。
系统调用函数时间开销较大,远大于小规模函数体内全部语句执行时间。若类体内成员函数无循环等控制结构,c++系统会默认为内置inline(类体内成员函数可以省去该关键字,但类体外想要inline不能省去的)函数处理。即:并非真正执行函数调用过程,只是把代码嵌入到程序调用点,大大减小时间开销。
class Student
{
public:
inline void display( );// inline必须有
private:
int num;
char name[20];
char sex;
};
inline void Student:: display( )//类外想定义为内置函数必须有inline
{cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"sex:"<<sex<<endl;
}
Student stu1,stu2;
成员函数存储方式
每个对象存储空间只有数据部分,公共的函数代码不占空间,即使是inline声明的成员函数也不占用代码,inline声明作用是在调用该函数时插入代码段到调用口,而非跑道调用函数地址口去执行,这不属于同一个问题哦
对象成员的引用
(1)用 .成员运算符
stu1.display( );//必须写明对象名
(2)用 p->name,*p就是对象
(3)引用符&,即采用一个符号代替原对象名
采用引用方式时,原对象和引用对象共占同一段存储单元,
Student stu1;
Student &Wangpan=stu1;
cout<<Wangpan.num;
应用举例
最简单的:只有一个对象
若不向类的数据成员赋值,则没有默认值,即值不可预知。
#include <iostream>
using namespace std;
class Time
{public: //数据公用,可以在类的外面操作。
int hour;
int minute;
int sec;
};//定义Time类
int main()
{
Time T1;//定义T1为time类对象
cin>>T1.hour;
cin>>T1.minute;
cin>>T1.sec;
cout<<T1.hour<<":"<<T1.minute<<":"<<T1.sec<<endl;//应用时必须加上对象名。
return 0;
}
引用多个对象的成员:
#include <iostream>
using namespace std;
class Time
{public: //数据公用,可以在类的外面操作。
int hour;
int minute;
int sec;
};//定义Time类
int main()
{
Time T1;//定义T1为time类对象
cin>>T1.hour;
cin>>T1.minute;
cin>>T1.sec;
cout<<T1.hour<<":"<<T1.minute<<":"<<T1.sec<<endl;//应用时必须加上对象名。
Time T2;//定义T1为time类对象
cin>>T2.hour;
cin>>T2.minute;
cin>>T2.sec;
cout<<T2.hour<<":"<<T2.minute<<":"<<T2.sec<<endl;//应用时必须加上对象名。
return 0;
}
程序很清晰,但是对象多时,主函数冗长。
采用类外函数对多个对象成员赋值
类的声明 } 后面要加;
函数的定义后面不用加;
形参 Time&t 是Time类对象的引用变量,调用时和相应实参T1 T2对象占用同一段内存,或者说t是她们的别名;
#include <iostream>
using namespace std;
class Time
{public: //数据公用,可以在类的外面操作。
int hour;
int minute;
int sec;
};//定义Time类
int main()
{
//函数声明
void set_time(Time&);//对应形参为引用变量
void show_time(Time&);
Time T1;
set_time(T1);
show_time(T1);
Time T2;
set_time(T2);
show_time(T2);
return 0;
}
//定义函数set_time,形参为引用变量
void set_time(Time&t)
{
cin>>t.hour;
cin>>t.minute;
cin>>t.sec;
}
void show_time(Time&t)
{
cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}
赋初值:
#include <iostream>
using namespace std;
class Time
{public:
int hour;
int minute;
int sec;
};
int main()
{
void set_time(Time&,int hour=0,int minute=0,int sec=0);//不同之处 相当于指定了数据默认值。必须只能在声明时给出,不能在定义时给出。
void show_time(Time&);
Time T1;
set_time(T1,12,23,34);//传递实参
show_time(T1);
Time T2;
set_time(T2);
show_time(T2);
return 0;
}
void set_time(Time&t,int hour,int minute,int sec)//相应形参变化,依次传递相应值。
{
cin>>t.hour;
cin>>t.minute;
cin>>t.sec;
}
void show_time(Time&t)
{
cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}
改用含成员函数的类来处理。
避免对各对象时处理操作的主函数冗长。
可以有效保护数据隐私的。数据声明为私有,可以被成员函数调用。上述的类外函数可以调用公共数据,但是无法调用隐私数据。
(1)写明函数作用域::。
(2)T1和T2的成员函数不会交叉访问数据;
(3)区分清域运算符::和成员运算符. 的使用场合:定义时指明所属类(域名::),调用时指明对象(成员符.)。
#include <iostream>
using namespace std;
class Time
{
public: //公用成员函数 可以调用类内所有数据
void set_time( );//类内成员函数声明
void show_time ( );
private:
int hour;
int minute;
int sec;
};
int main()
{
Time T1;//类成员定义
T1.set_time( );
T1.show_time( );
Time T2;
T2.set_time( );
T2.show_time( );
return 0;
}
void Time:: set_time( )//类内成员函数定义
{ cin>>hour;
cin>>minute;
cin>>sec;
}
void Time:: show_time( )
{
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
找最值
#include <iostream>
using namespace std;
class Array_max
{
public:
void set_value( );//类内成员函数声明
void max_value ( );
void show_value ( );
private:
int array[10];
int max;
};
void Array_max::set_value ()//成员函数定义,输入值
{
int i;
for (i=0;i<10;i++) cin >>array[i];//数组的输入
}
void Array_max::max_value ()//成员函数定义,找最值
{
int i;
max=array[0];
for (i=1;i<10;i++) if (array[i]>max) max=array[i];
}
void Array_max::show_value ()//成员函数定义,输出值
{
cout << "max="<<max;
}
int main()
{
Array_max arrmax;//定义对象arrmax
arrmax.set_value( );
arrmax.max_value( );
arrmax.show_value( );
return 0;
}
习题强化巩固
8.1找错误
(1)采用类外函数调用类内数据,但是数据默认为私有了,访问无效,改为public;
(2)main函数里函数调用前未声明。要么先声明函数 再调用;要么先定义函数,载写main函数;
#include <iostream>
using namespace std;
class Time
{public: //成员改为公用的
int hour;
int minute;
int sec;
};
Time t;
void set_time(void) //在 main 函数之前定义
{
cin>>t.hour;//需要指明是哪个引用对算符 t.
cin>>t.minute;
cin>>t.sec;
}
void show_time(void) //在 main 函数之前定义
{
cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}
int main()
{set_time();
show_time();
return 0;
}
8.2采用类体内成员函数实现功能
要点包括:类内成员函数声明;类内成员函数在外部的定义。
#include <iostream>//新建项必须写明后缀.cpp
using namespace std;
class Time
{public://write the public first
void set_time(void)//之前例子为
{
cin>>hour;//不用写引用运算符. 因为已经在类体内了
cin>>minute;
cin>>sec;
}
void show_time(void)
{
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
private:
int hour;
int minute;
int sec;
};
Time t;
int main()
{set_time();
show_time();
return 0;
}
8.3 采用类内成员函数:要求类内声明;类外定义。
#include <iostream>//新建项必须写明后缀.cpp
using namespace std;
class Time
{public://write the public first
void set_time(void);
void show_time(void)//类内声明
private:
int hour;
int minute;
int sec;
};
void Time::set_time(void)//类外定义 (指明函数的作用类域::即可 指明操作的类对象 是在main函数里的)
{cin>>t.hour;
cin>>minute;
cin>>sec;
}
void Time::show_time(void)
{cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
Time t;//对象定义写在函数定义后面。规范。
int main() //指明操作的类对象
{t.set_time();
t.show_time();
return 0;
}
8.6求体积
#include <iostream>
using namespace std;
class Box
{public:
void get_value();//可以不写()内容 返回的是无类型
float volume();//返回的是浮点型体积值
void display();
private:
float lengh;
float width;
float hight;
};
void Box::get_value()
{cin>>lengh;
cin>>width;
cin>>hight;
}
float Box::volume()
{return(lengh*width*hight);//返回体积值
}
void Box::display()
{cout<<volume()<<endl;
}
Box box1,box2,box3;
int main()
{box1.get_value();
cout<<"volmue of bax1 is ";
box1.volume();
box1.display();
box2.get_value();
cout<<"volmue of bax1 is ";
box2.volume();
box2.display();
box3.get_value();
cout<<"volmue of bax1 is ";
box3.volume();
box3.display();
return 0;
}