什么是面向对象?

在软件的设计过程中的两种方式:

  • 把程序按照算法的执行步骤来拆解,一步步实现,这是面向过程编程;

  • 把程序按照现实世界的理解,分成不同对象,通过多个对象之间的相互作用,来完成程序的最终功能,这是面向对象编程;

面向对象的三要素:类、对象和继承
面向对象特点:封装、继承、多态
面向对象好处:

按照我们对于现实世界的理解来把程序划分为不同的对象。

  • 容易理解为整个程序的设计思路:使用继承、封装、多态的特性,设计出高内聚、低耦合的系统结构.
  • 容易维护现有代码.
  • 容易拓展新增功能;

类的定义格式

可以使用struct或class作为关键字定义类,但使用struct的保护级别为public,而class的保护级别为private。通常使用class关键字;

类成员权限

关键字:public、private、protected作为访问权限控制符规定成员的访问权限;

  • public(公有成员):公有成员提供了类的接口功能,不仅可以被成员函数访问,而且还可以在程序中被访问。
  • private(私有成员):私有成员是被类隐藏的数据,只有该类的成员或者友元函数才可以访问‘
  • protect(保护成员):保护成员的成员变量,只允许在本类或者派生类中才可以访问,且在继承中保护成员的成员变量由保护成员变为私有成员;

类对象定义与成员的引用

对象定义

对象是类的实例,任何一个对象都是属于某个已知类的,对象定义格式如下

<类名> <对象名表>;

访问对象函数

一个类可以创建无数个对象,其任何一个对象都可以使用该类的操作,它们在不同的对象上反映出来。调用的成员函数与某个对象捆绑在一起的,“.”作为间隔符号指明哪个对象用了数据成员、成员函数;

访问一般对象的成员

<对象名>.<数据成员名>;

<对象名>.<成员函数名>;

访问指向对象的指针的成员

<对象指针名>-><数据成员名>

<对象指针名>-><成员函数名>

this指针

当我们在调用成员函数时,每个类的成员函数中都隐含了一个this指针,该指针指向正在调用成员函数的对象;如同于执行this=&s;语句;

所以无论哪个对象调用,成员函数从获得的参数(显式的实参和隐含的对象地址)来判断都不会弄错。

实例代码

以下代码建立了一个名为CDate的类,类中声明了void类型的set()函数与void类型的print()函数;

在main()函数中定义CData类的对象名为date,并使用data对象调用set()函数与print()函数;其中对象名为qdata是以指针的形式定义的对象,使用指针形式访问qdata对象的成员;

#include "stdafx.h"
#include <iostream>
using namespace std; class CDate
{
public:
void set(int m, int d, int y);
void print(); protected:
int m_year;
int m_month;
int m_day;
};
void CDate::set(int m, int d, int y)
{
cout << "this的地址:" << this << endl;
this->m_year = y;
this->m_month = m;
this->m_day = d;
}
void CDate::print()
{
cout << m_year << "-" << m_month << "-" << m_day;
} int main()
{
CDate date;
date.set(11, 9, 2016);
date.print(); CDate * qdate;
qdate->set(); return 0;
}

定义成员函数

定义类中的成员函数可以采用以下三种方式:

1.成员函数的定义及实现在类体中完成;

2.成员函数的定义及实现在类体外完成;

3.成员函数的定义及实现与类体在不同的文件中完成;

example1:

在类体外定义成员函数时须按下述格式:

<函数类型><类名>::<成员函数名>(参数){ 函数体 }

注意:"::" 为作用运算符,用来标识某个成员函数是属于哪个类的


class CTdata{
public:
void show( //类内定义,然后实现;
printf("hello");
);
void show1();
private:
};
void CTdata::show1() //类外引用作用域实现
{ printf("hello2");}
example2:

成员函数的定义及实现与类体在不同的文件中完成;


//tdate.h
class Ctdate2
{
public:
void show3();
} //tdate.cpp
#include "tdate.h" class Ctdate2::show3( printf("hello3"); );

作用域

类的作用域简称类域,类域的范围是指在类所定义的类体中,该类的成员局部于该类所属的类域。除了静态成员与静态成员函数外,一个类内的任何成员函数能访问同一类的任何成员变量;

当把成员定义为私有和保护时,外界访问被限制。域之前的权限,域与域之前的权限大小应是如下优先顺序:

文件域 > 类域 > 函数域

不同存储类的对象具有不同的生命期,对象的生存期是指对象从创建开始到被释放为止的存在时间,即该对象的寿命,按生命期的不同,对象可分为如下三种:

  • 局部对象:定义在一个函数体内或程序块内,作用域和生命周期都是局部的;
  • 全局对象:定义在某个文件中,作用域为包含该文件的整个程序,生命期是全局的;
  • 静态对象:分为内部静态对象和外部静态对象,生命期都是全局的,前者作用域定义它的函数体和程序块内;后者作用域为定义它的文件。

类与结构体的区别

  • 默认访问区别:

类定义中默认情况下的成员访问级别是private

结构体定义中默认情况下的成员访问级别是public

  • 初始化的区别:

类可以通过构造函数与析构函数初始化数据成员

结构体的初始化依靠特定的语法格式

注意:结构体也可以封装函数,但仅限于C++,C语言是不可以的;

实例代码

#include "stdafx.h"
struct Test
{
void fun()
{
printf("hello world");
}
int a;
};
class CTest
{
int a;
}; int _tmain(int argc, _TCHAR* argv[])
{
Test stc1;
CTest stc2;
stc1.fun(); //结构体也可以封装函数,仅限于C++,C语言中是不可以的.
stc1.a = 10;//结构体的默认保护属性是public
stc2.a = 20;//类的默认保护属性是private
return 0;
}

C++学习4-面向对象编程基础(面向对象概念,定义类,定义对象)的更多相关文章

  1. 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础

    第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...

  2. JAVA学习(五):Java面向对象编程基础

    Java面向对象编程基础 面向对象(Object oriented programming,OOP)技术是一种强有力的软件开发方法,它採用数据抽象与信息隐藏技术,来使软件开发简单化,以达到代码重用的目 ...

  3. (转)C++笔记:面向对象编程基础

    非常棒的总结 http://blog.csdn.net/liufei_learning/article/details/21312701 面向对象编程基础 面向对象编程基于三个基本概念: 数据抽象-类 ...

  4. C#面向对象编程基础-喜课堂笔记

    **************[5][C#面向对象编程基础]第1讲:类与对象****************                 *************2.1.1_类与对象的概念**** ...

  5. Java面向对象编程基础

    一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...

  6. Python学习-第三天-面向对象编程基础

    Python学习-第三天-面向对象编程基础 类和对象 简单的说,类是对象的蓝图和模板,而对象是类的实例.这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的 ...

  7. [.net 面向对象编程基础] (15) 抽象类

    [.net 面向对象编程基础] (15) 抽象类 前面我们已经使用到了虚方法(使用 Virtual修饰符)和抽象类及抽象方法(使用abstract修饰符)我们在多态一节中说到要实现类成员的重写必须定义 ...

  8. [.net 面向对象编程基础] (16) 接口

    [.net 面向对象编程基础] (16) 接口 关于“接口”一词,跟我们平常看到的电脑的硬件“接口”意义上是差不多的.拿一台电脑来说,我们从外面,可以看到他的USB接口,COM接口等,那么这些接口的目 ...

  9. [.net 面向对象编程基础] (17) 数组与集合

    [.net 面向对象编程基础] (17) 数组与集合 学习了前面的C#三大特性,及接口,抽象类这些相对抽象的东西以后,是不是有点很累的感觉.具体的东西总是容易理解,因此我们在介绍前面抽象概念的时候,总 ...

  10. [.net 面向对象编程基础] (19) LINQ基础

    [.net 面向对象编程基础] (19)  LINQ基础 上两节我们介绍了.net的数组.集合和泛型.我们说到,数组是从以前编程语言延伸过来的一种引用类型,采用事先定义长度分配存储区域的方式.而集合是 ...

随机推荐

  1. day11 内置函数

    特殊算数运算 计算整数的和 l = [1,2,3,4,5] print(sum(l)) 除法运算,然后取余 在做页面的时候可以根据数据量分页的时候使用 print(divmod(10,3)) # (3 ...

  2. MT【17】利用柯西不等式求三角的最大值

    评:此题也可以设$1+cos\theta=t$,平方后变成$t$的单变量利用均值去做. 柯西平衡系数法其实就是待定系数法,利用等号取到的条件.

  3. 【题解】 bzoj2006: [NOI2010]超级钢琴 (ST表+贪心)

    题面戳我 Solution 不会,看的题解 Attention 哇痛苦,一直不会打\(ST\)表,我是真的菜啊qwq 预处理 Log[1]=0;two[0]=1; for(int i=2;i<= ...

  4. ubuntu 18.04 使用 nvm 安装 nodejs

    20190315 使用 nvm 安装 nodejs 1. 找到 nvm 官网帮助 https://github.com/creationix/nvm 我习惯于 terminal 操作,所以选择 git ...

  5. /dev/null与/dev/zero区别

    /dev/null和/dev/zero的区别 /dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着! /dev/zero,是一个输入设备,你可你用它来初始化文件.该设备无穷尽 ...

  6. UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There Was One / POJ 3517 And Then There Was One / Aizu 1275 And Then There Was One (动态规划,思维题)

    UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There W ...

  7. [Cqoi2014]数三角形——组合数

    Description: 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Hint: 1<=m,n<=1000 ...

  8. javascript面向对象精要第三章对象整理精要

    什么是对象的数据属性?什么是对象的访问器属性?[put]方法是默认创建数据属性的,访 问器属性不包含值而是定义了一个单属性被读取时调用的函数(getter)和当一个属性被写入时 调用的函数(sette ...

  9. 清除ul li里面的浮动并让ul自适应高度的一个好办法

    有时候会遇到ul li列表里面的东西会用到浮动,这个时候ul的高度就不会被撑开,这怎么办呢? 1)最笨的方法就是设置ul的高度,但这种方法很死板,高度不能自适应 2)有次我试着在ul里面加一个清除浮动 ...

  10. golang格式化输出-fmt包用法详解

    golang格式化输出-fmt包用法详解 注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org    声明: 此片文章并非原创,大多数内容都是来自:https:// ...