下个阶段,我将讲解C++中面向对象的部分,也是C++对C语言改进的最重要的部分。以前C++也被叫做是"带类的C"。今天主要讲类的构成,成员函数以及对象的定义和使用。

  1.其实这一节,对于用C#开发的人来说,简直就是驾轻就熟啊。C++类的构成,我想从C的结构体开始说起。C中的结构体我想大家在熟悉不过了。

 1 #include "stdafx.h"
2 #include <iostream>
3
4 usingnamespace std;
5
6 struct Kid
7 {
8 int age;
9 char*name;
10 char*sex;
11 };
12
13 int main()
14 {
15 Kid kid1;
16 kid1.age=10;
17 kid1.name="rookie_j";
18 kid1.sex="男";
19 cout<<"姓名:"<<kid1.name<<endl<<"年龄:"<<kid1.age<<endl<<"性别:"<<kid1.sex<<endl;
20 return0;
21 }

  但是C中的结构体存在缺点:1.main函数中的任意赋值语句都可以访问结构体中的成员,但在现实生活中并不是什么数据都可以被随意访问的,因此C语言中的结构体的数据是不安全的;2.结构体中的数据和对该数据的操作是分离的,并不是一个被封装起来的整体,因此使程序难以重用,影响了软件生产效率;于是C++中引入了类的概念。

  C++中类的一般格式为:

class Kid

{

  private:

    int age;    //私有成员

    char *name;

    char *sex;

  public:      //公有成员

    void setKid(int age,char *name,char *sex);

    void showKid();

};

C++中规定如果没有对类的成员加私有private,保护protected,或公有public,则默认为私有的。而对于C++的结构体来说,成员可以是私有的,保护的或公有的,但默认为公有的;还有要注意的是不能在类的声明中给数据成员赋值,比如:

class Kid

{

  private :

    int age=10;

    char *name="rookie_j";

    char *sex="男";

};

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

  2.C++中的成员函数有两种,一种为普通的成员函数:

 1 class Kid
2 {
3 private:
4 int age;
5 char*name;
6 char*sex;
7 public:
8 void setKid(int age,char*name,char*sex);
9 void showKid();
10
11 };
12
13
14 void Kid::setKid(int age,char*name,char*sex)
15 {
16 Kid::age=age;
17 Kid::name=name;
18 Kid::sex=sex;
19 }
20
21 void Kid::showKid()
22 {
23 cout<<"姓名:"<<name<<endl<<"年龄:"<<age<<endl<<"性别:"<<sex<<endl;
24 }

要注意几点:1.类名和函数名之间应加上作用域运算符“::”,用于声明这个成员函数是属于哪一个类的,如果在函数名前没有类名,或既无类名又无作用域运算符“::”,比如:::showKid()或showKid(),那么这个函数不属于任何类,不是成员函数,而是普通函数;2.在类的声明中,成员函数原型的参数表中可以不说明参数的名字,而只说明它的类型,但在类外定义时必须既要说明参数类型又要说明参数名;

  另外一种就是内联成员函数,它又分显式声明和隐式声明:

隐式声明:

 1 class Kid
2 {
3 private:
4 int age;
5 char*name;
6 char*sex;
7 public:
8 void setKid(int age,char*name,char*sex)
9 {
10 Kid::age=age;
11 Kid::name=name;
12 Kid::sex=sex;
13 }
14 void showKid()
15 {
16 cout<<"姓名:"<<name<<endl<<"年龄:"<<age<<endl<<"性别:"<<sex<<endl;
17 }
18
19 };

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

显式声明:

 1 class Kid
2 {
3 private:
4 int age;
5 char*name;
6 char*sex;
7 public:
8 inline void setKid(int age,char*name,char*sex);
9 inline void showKid();
10 };
11
12
13 inline void Kid::setKid(int age,char*name,char*sex)
14 {
15 Kid::age=age;
16 Kid::name=name;
17 Kid::sex=sex;
18 }
19
20 inline void Kid::showKid()
21 {
22 cout<<"姓名:"<<name<<endl<<"年龄:"<<age<<endl<<"性别:"<<sex<<endl;
23 }

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

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

 1 class Kid
2 {
3 private:
4 int age;
5 char*name;
6 char*sex;
7 public:
8 inline void setKid(int age,char*name,char*sex);
9 inline void showKid();
10 }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;

  4.最后我们还是一样,用一个实例来总结一下今天所讲的内容(开发工具:vs2010):

 1 #include "stdafx.h"
2 #include <iostream>
3
4 usingnamespace std;
5
6 struct struct_Kid //结构体
7 {
8 int age; //默认公有
9 char*name;
10 char*sex;
11 }kid1;
12
13 class Kid
14 {
15 int age; //默认私有
16
17 private: //私有
18 char*name;
19 char*sex;
20
21 public: //公有
22 inline void setKid(int age,char*name,char*sex);//显示内联
23 /*{
24 Kid::age=age;
25 Kid::name=name;
26 Kid::sex=sex;
27 }*/
28 void showKid()//隐式内联
29 {
30 cout<<"类:"<<endl<<"姓名:"<<name<<endl<<"年龄:"<<age<<endl<<"性别:"<<sex<<endl;
31 }
32
33 }kid2;//直接定义对象
34
35
36 inline void Kid::setKid(int age,char*name,char*sex)
37 {
38 Kid::age=age;
39 Kid::name=name;
40 Kid::sex=sex;
41 }
42
43 int main()
44 {
45 //结构体
46 kid1.age=10;
47 kid1.name="rookie_j";
48 kid1.sex="男";
49 cout<<"结构体:"<<endl<<"姓名:"<<kid1.name<<endl<<"年龄:"<<kid1.age<<endl<<"性别:"<<kid1.sex<<endl;
50
51 cout<<"--------------------"<<endl;
52
53 //类
54 Kid kid3,*ptr;
55 Kid &kid4=kid3;
56 ptr=&kid2;
57
58 kid2.setKid(0,"rookie_y","男");
59 kid2.showKid();
60
61 cout<<"--------------------"<<endl;
62
63 //指针调用成员函数
64 (*ptr).setKid(20,"rookie_y","女");//或ptr->setKid(20,"rookie_z","女");
65 kid2.showKid();
66
67 cout<<"--------------------"<<endl;
68
69 //对象名调用成员函数
70 kid3.setKid(10,"rookie_x","男");
71 kid3.showKid();
72
73 cout<<"--------------------"<<endl;
74
75 //引用调用成员函数
76 kid4.setKid(30,"rookie_x","女");
77 kid3.showKid();
78
79 return0;
80 }

结果:

C++之类与对象(1)的更多相关文章

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  3. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  4. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  5. JS核心系列:浅谈原型对象和原型链

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

  6. Chrome出了个小bug:论如何在Chrome下劫持原生只读对象

    Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...

  7. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  8. ASP.NET内置对象的总结

    1. Response对象可形象的称之为响应对象,用于将数据从服务器发送回浏览器. 实例源码:链接: http://pan.baidu.com/s/1dDCKQ8x 密码: ihq0  2. Requ ...

  9. ADO.NET对象的详解

    1. Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能 ...

  10. 对Castle Windsor的Resolve方法的解析时new对象的探讨

    依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 ...

随机推荐

  1. XSS CSRF

    XSS CSRF XSS 参考 https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%B6%B2%E7%AB%99%E6%8C%87%E4%BB%A4%E7%A2%BC ...

  2. 预处理指令中#Pragma

    在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...

  3. VS2010/MFC字体和文本输出:文本输出

    字体和文本输出:文本输出 本节主要讲解文本输出的方法和实例. 文本输出过程 在文本输出到设备以前,我们需要确定字体.字体颜色和输出的文本内容等信息.Windows窗口的客户区由应用程序管理,所以我们还 ...

  4. iso-开发基础知识-5-适配器

    个人学习总结仅供参考:欢迎拍砖 1.适配器:用于连接两种不同种类的对象. 2.分为2种:类适配,对象适配. 3.委托(Delegate)模式属于对象适配器: 4.何时使用适配器模式 书中的这幅图更好的 ...

  5. mongoose的用法(注:连接数据库)

    第一步:连接数据库: mongoose.connect('mongodb://'+user+':'+pass+'@mongo.duapp.com:'+port+'/xzWIRHYlWLAApdsfAz ...

  6. jquery.cookie用法详细解析,封装的操作cookie的库有jquery.cookie.js

    jquery.cookie用法详细解析 需要注意存入cookie前,对数据进行序列化, 得到后在反序列化: 熟练运用:JSON.stringify();和JSON.parse(): 通常分为如下几个步 ...

  7. 我的MYSQL学习心得 mysql的权限管理

    这一篇<我的MYSQL学习心得(十三)>将会讲解MYSQL的用户管理 在mysql数据库中,有mysql_install_db脚本初始化权限表,存储权限的表有: 1.user表 2.db表 ...

  8. ios中的GCD

    前面我们说了block中提到它用于多线程,而gcd则是其用于多线程的典型.gcd其全称(Grand Central Dispatch) 那到底什么叫gcd,官方的解释如下: Grand Central ...

  9. 如何解决Android 5.0中出现的警告:Service Intent must be explicit

    有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 5.0一出来后,其中有个特性就是Service Intent  must be explitict,也就是说从Lollip ...

  10. visual studio2013负载测试简单问题记录

    问题1: 错误 xxxx/xx/xx xx:xx:xx 未能对测试运行“xxxxxxxxxxx”进行排队: 活动的测试设置配置为使用 Visual Studio Online 运行测试. 使用团队资源 ...