8.15-16类和对象以及上机实践

本文深入探讨C++中类与对象的概念,包括类的声明、对象的定义、成员函数的使用及其存储方式等内容,并通过实例说明如何利用类和对象进行程序设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决了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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值