成员函数的实现(函数定义)都写在类体中,与一般的函数定义一样。

class TDate
{
public:
void SetDate(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
void Print()
{
cout<<year<<"."<<month<<"."<<day<<endl;
}
private:
int year,month,day;
} 

成员函数在类体中声明,实现在类体外且在声明之后 例:

class TDate
{
public:
void SetDate(int y,int m,int d);
void Print();
private:
int year,month,day;
}
void TDate::SetDate(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
void TDate::Print()
{
cout<<year<<"."<<month<<"."<<day<<endl;
}

::为作用域运算符,用来标识某个成员函数是属于哪个类的。
注意:
1.在类体中不允许对所定义的数据成员进行初始化,例:

class TDate
{
public:
.
.
.
private:
int year(1989),month(6),day(4);
}

语法错误,编译无法通过。
2.数据成员的类型可以为:int、float、char、数组、指针和引用、对象(自身类的对象不可以,自身类的指针或引用可以),一个类的对象作为某个类的成员时,如果类的定义在后,要提前说明。

class N;
class M
{
public:
.
.
.
private:
class N
}
class N
{
.
.
.
}

3.一般地,在类体内先说明公有成员,后说明私有成员。说明数据成员时,按数据类型的大小,由小到大说明。
4.经常习惯性的将类定义的说明部分或整个定义部分(包含实现部分)放到头文件里面,后面引用比较方便。

对象的定义
TDate date1,*Pdate,data[32],&rdate=date1;//一般对象名,指向对象的指针,对象数组,对象的引用(它是date1的别名)
对象成员的表示方法
date1的成员可表示为:
date1.year//数据成员
date1.SetDate(int y,int m,int d)//成员函数
指针Pdate的成员可表示为:
Pdate->year//数据成员
date1->SetDate(int y,int m,int d)//成员函数

(*Pdate).year
(*PDate).SetDate(int y,int m,int d)
引用对象的成员表示和一般对象的成员表示相同。

#include <iostream>
#include <tdate.h>
using namespace std;
void main()
{
TDate date1,date2;
date1.SetDate(1989,6,4);
date2.SetDate(2009,7,5);
date1.Print();
date2.Print();
double q;
std::cin>>q;
}

对象的初始化

class TDate
{
public:
TDate(int y,int m,int d);//构造函数(成员函数) 函数体可写在类体内,也可写在类体外
//可以有若干个参数,可以设置参数的缺省值,因此可以重载
//不能直接调,创建对象时系统会自动调用
//没有显式定义构造函数,将使用缺省构造函数
~TDate();//析构函数(成员函数) 函数体可写在类体内,也可写在类体外
//不指定数据类型,无参数,无法重载
//析构函数自动调用的情形:(1)定义在一个函数体内的对象,当这个函数结束时 (2) 一个对象使用new运算符动态创建,使用delete运算符释放它时
//没有显式定义析构函数,将使用缺省析构函数
void Print();
private:
int year,month,day;
};
TDate::TDate(int y, int m, int d)
{
yaer=y;
month=m;
day=d;
cout<<"Constructor called.\n";
}
TDate::~TDate()
{
cout<<"Desstructor called.\n";
}
void TDate::Print()
{
cout<<year<<"."<<month<<"."<<day<<endl;
}

注意:类中的函数的函数体要么都写在类体内,要么都写在类体外,规范编码。
构造函数、析构函数的应用

void main()
{
TDate date1(1999,6,4),date2(2009,7,5);
//TDate date1,date2; 缺省构造函数cout<<"19900604 Event is ";
date1.Print();
cout<<"20090705 Event is ";
date2.Print();
}

拷贝初始化构造函数
是一种特殊的构造函数,作用是用一个已知的对象来初始化一个被创建的同类的对象。
初始化的过程是将已知对象的数据成员的值拷贝给正在创建的另一个同类的对象。

class TDate1
{
public:
TDate1(int y,int m,int d){
year=y;
month=m;
day=d;
cout<<"Constructor called.\n";
}
~TDate1()
{
cout<<"Desstructor called.\n";
}
//函数名与类名相同,参数为引用同类的一个对象,如果无显示定义拷贝初始化函数,编译系统会自动生成一个,作为该类的公有成员
TDate1(TDate1 &p)
{
year=p.year;
month=p.month;
day=p.day;
cout<<"Copy_initialization Constructor called.\n";
}
void Print()
{
cout<<year<<"."<<month<<"."<<day<<endl;
}
public:
int year,month,day;
};

调用拷贝初始化函数(3种情况)

TDate1 f(TDate1 Q);
void main()
{
TDate1 date1(1989,6,4),date2(2009,7,5);
TDate1 date3(date1);//情况1:明确表示由一个对象初始化另一个对象
date2 = f(date3);//情况2:对象作为函数实参传递给函数形参cout<<"6.4 Event is ";
date1.Print();cout<<"date3's data number is ";date3.Print();cout<<"date2's data number is ";
date2.Print();
}
TDate1 f(TDate1 Q)
{
cout<<"ok\n";
int year,month,day;
year=Q.year+1;
month=Q.month+1;
day=Q.day+1;
TDate1 R(year,month,day);
return R;//情况3:对象作为函数返回值
}

成员函数的特性
成员函数分为内联函数和外联函数
内联函数的函数体放在类体内,编译过程和宏定义一样采用替换原则,执行效率高。一定要在调用之前进行定义且内联函数无法递归调用
外联函数说明在类体内定义在类题外,函数体在类的实现部分
在外联函数的函数头前面加上inline就可以变成外联函数

静态成员
解决数据的共享问题
实现多个对象之间的数据共享,可以不使用全局对象,而是用静态的数据成员
它是类的所用对象共享的成员,而不是某个对象的成员,节省内存
初始化时注意:
在类体外初始化,前面不用加static
不加该成员的访问控制符private、public等
用作用域运算符来表明它所属的类,它为类的成员,而非对象的
静态数据成员

class MyClass
{
public:
MyClass(int a,int b);
void GetNumber();
void GetSum();
private:
int A,B;
static int Sum;};
int MyClass::Sum = 0;//在类体外初始化,前面不用加static,不加该成员的访问控制符private、public等
MyClass::MyClass(int a,int b)
{
A=a;
B=b;
Sum+=A+B;
}
void MyClass::GetNumber()
{
std::cout<<"A="<<A<<",B="<<B<<std::endl;
}
void MyClass::GetSum()
{
std::cout<<"sum="<<Sum<<std::endl;
}
void main()
{
MyClass M(3,7),N(14,9);
M.GetNumber();
N.GetNumber();M.GetSum();
N.GetSum();
}
}

静态成员函数

class M
{
public:
M(int a){A=a,B+=a;}
static void f1(M m);
private: int A;
static int B;
};
//在静态成员函数的实现中可以引用类中的静态成员,必须经过对象来引用类中说明的非静态成员
void M::f1(M m)
{
std::cout<<"A="<<m.A<<",B="<<B<<std::endl;
}
int M::B=0;
void main()
{
M P(5),Q(10);
//静态成员函数的调用
M::f1(P);
M::f1(Q);
}

友元
是一种定义在类外部的普通函数,需要在类体内进行说明,  前面加friend
非成员函数但能访问类的私有成员
提高了程序运行效率,但破坏了类的封装性和隐藏性
友元函数

class Point
{
public:
Point(double xx,double yy){x=xx;y=yy;}
void Getxy();
friend double Distance(Point &a,Point &b);
private:
double x,y;
};
void Point::Getxy()
{
std::cout<<"x="<<x<<",y="<<y<<std::endl;
}
double Distance(Point &a,Point &b)
{
//通过对象引用类的私有成员
double dx=a.x-b.x;
double dy=a.y-b.y;
return sqrt(dx*dx+dy*dy);
}
void main()
{
Point p1(3.0,4.0),p2(6.0,8.0);
p1.Getxy();
p2.Getxy();
double d=Distance(p1,p2);//直接调用友元函数
std::cout<<"Distance is "<<d;
}

转载于:https://www.cnblogs.com/CrazeCoder/archive/2010/07/21/1782457.html

C++学习笔记之类和对象I相关推荐

  1. JavaScript:学习笔记(9)——Promise对象

    JavaScript:学习笔记(9)--Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...

  2. python学习笔记4(对象/引用;多范式; 上下文管理器)

    python学习笔记4(对象/引用:多范式; 上下文管理器) ### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是 ...

  3. 传智博客学习笔记8--面向对象下

    传智博客学习笔记8--面向对象下 2009-3-12 15:41:42 继承 extends 接口 interface 如果一个抽象类中的所有方法都是抽象的,我们就可以将这个类用另外一种方式来定义,也 ...

  4. jmh学习笔记-State共享对象

    系列文章目录 jmh学习笔记-源代码编译与bench mode jmh学习笔记-State共享对象 jmh学习笔记-State共享对象前后置方法 jmh学习笔记-代码清除 jmh学习笔记-常量折叠 j ...

  5. 前端JS学习笔记——内置对象Math、Date 、Array、String

    目录 1.Math常用方法 2.Date()方法 如何获取Date的时间戳 Date()方法的使用 格式化日期时间 格式化输出一串时间日期 倒计时功能 3.Array方法 创建数组对象的两种方法 检测 ...

  6. 《Java编程思想》学习笔记【一对象导论】

    重头学习Java,大一没怎么学,大二上课也没听.(流下不学无术的眼泪) 所有编程语言都提供抽象机制,我们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象," ...

  7. JS学习笔记之内置对象 4.21

    1 内置对象 JavaScript 中的对象分为3种:自定义对象 .内置对象. 浏览器对象 内置对象就是指 JS 语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或最基本而必要的功能(属性 ...

  8. JavaScript学习笔记之原型对象

    本文是学习<JavaScript高级程序设计>第六章的笔记. JS中,便于批量创建对象的三种模式: 1.工厂模式:用一个函数封装创建对象的细节,传入必要的参数,在函数内部new一个对象并返 ...

  9. JAVA编程思想学习笔记——第一章 对象导论

    搞了一年多java,野路子出身,发现java基础这块还是相当的薄弱!故决定学习<Java编程思想>这本书.在此把学习的知识点记录下! 面向对象的五大特性 1.万物皆为对象 2.程序是对象的 ...

  10. python内建函数测试对象身份_Python学习笔记 03 Python对象

    1.Python对象 Python对象都拥有三个特性:身份.类型和值. 身份:每一个对象都有一个唯一的身份标识自己,任何对象的身份都可以使用内建函数id()来得到.这个值可以被认为是该对象的内存地址. ...

最新文章

  1. 杨超越的声音+高晓松的脸~如此酸爽的技术,你值得拥有!
  2. linux 失败模式,在Linux中在AP模式下扫描失败(wpa_supplicant)
  3. Round Robin 算法
  4. js错误:对象不支持此属性或方法
  5. 五十、Maven系列:安装和配置Maven镜像
  6. 【ZJOI2015】幻想乡战略游戏【点分树】【带权重心】
  7. java g1 gc ref proc_深入理解垃圾收集器的G1及日志分析
  8. 光盘隐藏文件夹 linux,linux常用命令大全2--挂载/dpkg/文件系统分析/apt/光盘/关机...
  9. PoseCNN代码复现CMake编译找不到math_functions.hpp
  10. 正则表达式去除括号的问题
  11. Linux 基本命令(三)--histroy 常用命令详解
  12. c语言编程打印格式输出总结
  13. C语言 进制转换 将十进制转换为任意进制
  14. python实现wgs84坐标系和ECEF坐标系的互换
  15. 十年前的生活小技巧文章
  16. CSS3左右滑动开关按钮
  17. 双系统下Ubuntu完整卸载
  18. 国外不良资产证券化经验总结
  19. python教程111-Python多条件计数与求和
  20. mysql 主码和外码_sql如何用sql语句对一个已经编辑好的表在设置主码和外码?Atlassian Confluence安装以及咋更改数据库...

热门文章

  1. 58 页 PPT 揭示图神经网络研究最新进展
  2. 干货 | 集成学习综述与代码实现
  3. 使用k-近邻算法进行分类
  4. LeetCode刷题——62. 不同路径
  5. pytorch基础知识
  6. x86基础之数与数据类型
  7. 贝叶斯分类与贝叶斯网络
  8. 海量数据挖掘MMDS week7: 相似项的发现:面向高相似度的方法
  9. python的invalid syntax是什么意思_python中出现invalid syntax报错的几种原因
  10. mysql还原详解_MySQL 备份与还原详解