C++基础:类与对象(创建 成员 访问)

C中的结构体存在缺点:

1.函数中的任意赋值语句都可以访问结构体中的成员,但在现实生活中并不是什么数据都可以被随意访问的,因此C语言中的结构体的数据是不安全的;

2.结构体中的数据和对该数据的操作是分离的,并不是一个被封装起来的整体,因此使程序难以重用,影响了软件生产效率;于是C++中引入了类的概念。

C++中规定如果没有对的成员加私有private,保护protected,或公有public,则默认为私有的。

而对于C++的结构体来说,成员可以是私有的,保护的或公有的,但默认为公有的;还有要注意的是不能在类的声明中给数据成员赋值.

一般情况下,一个类的数据成员应该声明为私有的,成员函数声明为共有的。这样,内部的数据隐藏在类中,在类的外部无法访问直接访问,使数据得到有效的保护。而公有的成员函数就成为一种与类外部沟通的接口。

(1)普通的成员函数:

C++中的成员函数要注意几点:

1.类名和函数名之间应加上作用域运算符“::”,用于声明这个成员函数是属于哪一个类的,如果在函数名前没有类名,或既无类名又无作用域运算符“::”,那么这个函数不属于任何类,不是成员函数,而是普通函数;

2.在类的声明中,成员函数原型的参数表中可以不说明参数的名字,而只说明它的类型,但在类外定义时必须既要说明参数类型又要说明参数名;

(2)内联成员函数:

内联函数又分为显式声明和隐式声明2种方式。

隐式声明:(这种定义的内联成员函数没有使用关键字inline进行声明,因此叫隐式定义)

class Kid
 {
 private:
 int age;
 char*name;
 char*sex;
 public:
 void setKid(int age,char*name,char*sex)
         {
             Kid::age=age;
             Kid::name=name;
             Kid::sex=sex;
         }
 void showKid()
         {
             cout<<"姓名:"<<name<<endl<<"年龄:"<<age<<endl<<"性别:"<<sex<<endl;
         }
 
 };

显式声明:

class Kid
 {
 private:
 int age;
 char*name;
 char*sex;
 public:
         inline void setKid(int age,char*name,char*sex);
         inline void showKid();
 };
 
 
 inline void Kid::setKid(int age,char*name,char*sex)
 {
     Kid::age=age;
     Kid::name=name;
     Kid::sex=sex;
 }
 //注意:line 应该在函数定义之前(在声明之前是否有inline对函数是否内联不影响)
 inline void Kid::showKid()
 {
     cout<<"姓名:"<<name<<endl<<"年龄:"<<age<<endl<<"性别:"<<sex<<endl;
 }

//建议把inline函数的定义放到头文

 

内联函数的调用就是代码的扩展,而不是一般函数的调用的操作;但要注意的是使用inline定义的内联函数必须将类的声明和内联成员函数的定义都放在同一个文件中,否则编译时无法进行代码的置换

 

在C++中,类与对象的关系,可以用数据类型int和整形变量i之间的关系来类比。int类型和类类型代表一种抽象的概念,而整形变量和类的对象代表具体的东西。C++把类的变量称为类的对象,对象也被称为类的实例;类的对象可以是:

class Kid
 {
 private:
 int age;
 char*name;
 char*sex;
 public:
         inline void setKid(int age,char*name,char*sex);
         inline void showKid();
 }kid1,kid2;

也可以是声明了类后,使用时在定义对象:Kid kid1,kid2;(声明一个类后,它并不接受和存储具体的值,只作为生成具体对象的一种“样板”,只有定义了对象后,系统才为对象分配存储空间,以存放对象中的成员);

  对对象中的成员的访问可以是:

1.对象名.数据成员名/对象名.成员函数名(参数),比如kid1.setKid(10,"rookie_j","男");

2.指针访问对象中成员,比如:class Kid{public: int age;}; Kid kid,*ptr; ptr=&kid;cout<<ptr->age//cout<<(*ptr).age;

3.还记得上节所讲到的引用(reference)么,还可以通过引用来访问对象中的成员:class Kid{public: int age;}; Kid kid;Kid &ptr=kid; cout<<ptr.age//cout<<kid.age;

 

举例说明:

#include "stdafx.h"
 #include <iostream>
 
 usingnamespace std;
 
 struct struct_Kid //结构体
 {
 int age; //默认公有
 char*name;
 char*sex;
 }kid1;
 
 class Kid
 {
 int age; //默认私有
 
 private:  //私有    
 char*name;
 char*sex;
 
 public: //公有
         inline void setKid(int age,char*name,char*sex);//显示内联
 /*{
             Kid::age=age;
             Kid::name=name;
             Kid::sex=sex;
         }*/
 void showKid()//隐式内联
         {
             cout<<"类:"<<endl<<"姓名:"<<name<<endl<<"年龄:"<<age<<endl<<"性别:"<<sex<<endl;
         }
 
 }kid2;//直接定义对象
 
 
 inline void Kid::setKid(int age,char*name,char*sex)
 {
     Kid::age=age;
     Kid::name=name;
     Kid::sex=sex;
 }
 
 int main()
 {
 //结构体
     kid1.age=10;
     kid1.name="rookie_j";
     kid1.sex="男";
     cout<<"结构体:"<<endl<<"姓名:"<<kid1.name<<endl<<"年龄:"<<kid1.age<<endl<<"性别:"<<kid1.sex<<endl;
 
     cout<<"--------------------"<<endl;
 
 //类
     Kid kid3,*ptr;
     Kid &kid4=kid3;
     ptr=&kid2;
 
     kid2.setKid(0,"rookie_y","男");
     kid2.showKid();
 
     cout<<"--------------------"<<endl;
 
 //指针调用成员函数
     (*ptr).setKid(20,"rookie_y","女");//或ptr->setKid(20,"rookie_z","女");
     kid2.showKid();
 
     cout<<"--------------------"<<endl;
 
 //对象名调用成员函数
     kid3.setKid(10,"rookie_x","男");
     kid3.showKid();
 
     cout<<"--------------------"<<endl;
     
 //引用调用成员函数
     kid4.setKid(30,"rookie_x","女");
     kid3.showKid();
 
 return0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值