下个阶段,我将讲解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. IOS 特定于设备的开发:处理基本方向

    UIDevice类使用内置的orientation属性获取设备的物理方向.IOS设备支持这个属性的7个可能的值. >UIDeviceOrientationUnknown:方向目前未知. > ...

  2. 贪吃蛇AI

    贪吃蛇AI 作者:CodeNoob 转载请标明作者和出处 序言 前几天在网上看到一张让人涨姿势的图片,这张图片我很早以前看过,当时就觉得肯定是程序实现的,只是当时还比较渣,不会算法.这次学了java也 ...

  3. hibernate-search-5.1.1简易使用

    系统要求java7和hibernate-core-4.3.8,此外还依赖如下jar包 使用demo如下: package com.ciaos.controller; import java.io.IO ...

  4. 实习生的Django[1]

    尽管学期尚未结束,暑假尚未到来,可是大三的同学非常多已经和我一样開始实习或者实习一段时间了.我仅仅面试了一间数据挖掘的公司的研发部,还算顺利通过. 来这里实习后,由于网络原因,昨天没有刷题也没有写BL ...

  5. sublime test3 使用技巧

    sublimeText3使用技巧 常用快捷键 ctrl+d :选中光标处的文本单元,继续按ctrl+d选中相同文本单元 alt+F3 :功能和ctrl+d类似,用于批量修改相同文本 shift+↑ ↓ ...

  6. Android SQLite之乐学成语项目数据库存储

    一.SQLite是什么?为什么要用SQLite?SQLite有什么特点?(下面小编一 一解答) ①SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用, 不仅支持 标 ...

  7. myeclipse 配置weblogic 异常

    java.lang.UnsupportedClassVersionError: Bad version number in .class file当前JDK与weblogic版本不匹配.

  8. 我用过的linux命令--安装Hadoop

    1. hadoop软件传送给虚拟机 还是利用WinSCP把hadoop软件安装包,放到linux的Downloads文件夹中. 2. 选择安装目录 把hadoop安装包copy到这个安装目录中,这里我 ...

  9. viewport的作用

    <meta name="viewport" content="width=device-width,height=device-height,inital-scal ...

  10. Android 开发笔记“Eclipse 调试和快捷键”

    原文地址:http://blog.sina.com.cn/s/blog_5cf876340100aswr.html Eclipse 调试器和 Debug 视图 Eclipse SDK 是针对 Java ...