C++自学--2

类的声明和对象的定义

1声明类的类型:
struct Student //声明一个名为Student的结构体类型
{int num;
char name[20];
char sex;
};
Student stud1,stud2; //定义了两个结构体变量stud1,stud2

class Student //以class开头,类名为Student
{int num;
char name[20];
char sex; //以上3行是数据成员
void display() //这是成员函数
};
{
cout<<“num:”<<num<<endl;
cout<<“name:”<<name<<endl;
cout<<“sex”<<sex<<endl; //以上三行是函数中的操作语句
}
};
Student student1,student2; //定义了两个Student 类的对象stud1和stud2

class下默认的类定义下是私有
struct默认是公有

class类名
{
private:
私有数据成员
public:
公用的数据成员
};

定义对象的方法:

1 先声明类类型,然后再定义对象
Student stud1,stud2; //Student是已经声明的类类型

class 类名 对象名

如 class Student stud1,stud2;

2在声明类的同时定义对象
class Student
{
public:
void display()
{cout<<“num:”<<num<<endl;
cout<<“name:”<<name<<endl;
cout<<“sex:”<<sex<<endl;
}
private:
int num;
char name[20];
char sex;
}stud1,stud2;
3不出现类名,直接定义对象
class
{private:
.
.
.
public:
.
.
.

}stud1,stud2;

类和结构体类型的异同
struct和class的区别
struct默认是公有
class默认是私有

3类的成员函数
成员函数的性质:有的函数并不是准备为外界调用的,就应该指定为 private,用户不能调用这些私有的函数

在类外定义成员函数

class Student
{ public:
void display();
private:
int num;
string name;
char sex;

};
void Student::display()
{cout<<“num:”<<num<<endl;
cout<<“name:”<<name<<endl;
cout<<“sex:”<<sex<<endl;
}
Student stud1,stud2;
“::“是作用域限定符
如果在作用域运算符”::“的前面没有类名,或者函数名前面既无类名又无作用域运算符”::”,如
::display()

display()
则表示display函数不属于任何类,这个函数不是成员函数,而是全局函数,即一般普通函数

内置成员函数(inline成员函数)
class Student
{
public:
inline void display();
private:
int num;
string name;
char sex;
};
inline void Student::display()
{
cout<<“num:”<<num<<endl;
cout<<“name:”<<name<<endl;
cout<<“sex”<<sex<<endl;
}

利用内置函数不利于类的接口与类的实现分离,不利于信息隐蔽,虽然程序执行效率提高,但从软件工程质量的角度看,这样做并不是好办法.

成员函数的存储方式

同一类的不同对象中的数据成员的值一般是不相同的,而不同对象的函数代码是相同的,不论调用哪一个对象的函数代码,其实调用的都是同样内容的代码.

这就证明一个对象所占的空间大小只取决于该对象中数据成员所占的空间.而与成员函数无关

(1)不论成员函数在类内定义还是在类外定义,成员函数的代码的存储方式是相同的,都不占用对象的存储空间
(2)不要将成员函数的这种存储方式和inline(内置)函数的概念混淆
不论是否用inline声明,成员函数的代码段都不占用对象的存储空间
inline函数只影响程序的执行效率而与成员函数是否占用对象的存储空间无关
(3)虽然成员函数并没有放在对象的存储空间中但从逻辑的角度,成员函数是和数据一起封装在一个对象中的,只允许本对象中成员的函数访问同一对象中的私有数据

对象成员的引用

1通过对象名和成员运算符访问对象中的成员

例:
stud1.num=1001;
其中"."是成员运算符,用来对成员进行限定,指明所访问的是哪一个对象中的成员
一般形式为:
对象名.成员名
stud1.display();
在类外只能调用公用的成员函数,在一个类中应当至少有一个公用的成员函数,作为对外的接口,否则就无法对对象进行任何操作.

2通过指向对象的指针访问对象中的成员
可以通过指针去问对象中的成员
如:
class Time
{public:
int hour;
int minute;
};
Time t,*p;
p= & t;
cout<< p - > hour; //输出p指向的对象中的成员hour
p->hour表示p当前指向对象t中的成员p->hour, (*P).hour 和 t.hour三者等价

通过对象的引用来访问对象中的成员
Time t1; //定义对象t1
Time &t2=t1; //定义Time类引用t2,并使之初始化为t1
cout<<t2.hour; //输出对象t1中的成员hour

类和对象的简单应用举例
#include< iostream >
using namespace std;
class Time
{
public:
int hour;
int minute;
int sec;
};

int main()
{
Time t1;
cin>>t1.hour;
cin>>t1.minute;
cin>>t1.sec;
cout<<t1.hour<<":"<<t1.minute<<":"<<t1.sec<<endl;
return 0;
}

运行结果:
12 32 43
12:32:43

(1) 由于是在类外引用对象t1的数据成员hour,minute,sec,因此不要忘记在前面指定对象名t1
(2)不要把对象名错写为类名**,因为类是一种抽象的数据类型,并不是一个实体,也不占存储空间**,而对象是实际存在的实体,是占存储空间的,其数据成员是有值的,可以被引用的

按照上面的这个例子,每次去调用类创建对象需要进行单个的声明,为了解决这个问题
#include< iostream >
using namespace std;
class Time
{
public:
int hour;
int minute;
int sec;
};
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;
}

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;
}

函数set_time和show_time是普通函数不是成员函数

可以对上面的程序做一些修改,数据成员的值不再由键盘输入,而在调用函数时由实参给出,并在函数中使用默认参数,

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)
{
t.hour=hour;
t.minute=minute;
t.sec=sec;
}

void show_time(Time& t)
{
cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}
运行结果:
12:23:34
0:0:0

若将定义set_time函数改成:
void set_time(Time& t,int hour=9,int minute=30,int sec=0)
在编译时上行指定的默认参数值不起作用,程序运行你结果仍然为
12:23:34
0:0:0

将程序改用成员函数来处理

#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;
}

因为蝙蝠病逼得我在家学习,淦.
2020/2/15

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值