系列文章目录

重新复习c++,所以把书中的重点内容整理成博客,尽量简洁,易懂。

C++ 类与对象_类和对象的定义与访问 (定义类和对象,访问对象成员,this指针)

C++ 类与对象_构造函数和析构函数 (带参数的构造函数,重载构造函数,复制构造函数)

C++ 类与对象_类的包含(参数初始式)


文章目录

  • 系列文章目录
  • 前言
  • 一、常成员
    • 1.常数据成员
    • 2.常对象
    • 3.常成员函数
  • 二、静态成员
    • 1.静态数据成员
    • 2.静态成员函数
  • 三、友元
    • 1.友元函数
    • 2.友元类

前言

这里讨论的是约束为只读的常成员,类对象共享的静态成员,具有最高访问权限的友元。


一、常成员

1.常数据成员

const可以约束基本类型的数据成员为常数据成员。
有两种方式对常数据成员进行初始化
1、在构造函数中直接用常量进行初始化,这样每个对象建立的常数据成员都有相同的值。

class Mclass
{public:const int M;Mclass():M(5){}      //用初始式对常数据成员赋值
};

2、使用带参数的构造函数,创建对象时,用实际参数对常数据成员赋值,这样每个对象的常数据成员可以有不同的值。

class Mclass
{public:Mclass(int, int, int,int num = 0);void print(){cout << code << endl;}
private:const int code;int year, month, day;
};Mclass::Mclass(int a, int b, int c,int num) :code(num)        //地采纳数构造函数完成数据成员初始化
{year = a;month = b;day = c;
}

2.常对象

若在定义对象的说明语句以const作前缀,则该对象为常对象,这个对象的全部数据成员在作用域中约束为只读。

class Tlass
{public:int a;
};int main()
{const Tlass cla;
}

3.常成员函数

常成员函数this指针被约束为指向常量的常指针。const成员函数的函数体代码不能修改this所指对象的成员。示例代码如下:

class Tlass
{public:void print()const;int a = 1;
};void Tlass::print()const
{cout <<"const using:"<< a << endl;
}
int main()
{Tlass cla;cla.print();
}

二、静态成员

1.静态数据成员

静态数据成员要求在类中声明,类外定义。一般的数据对象在说明对象时建立内存,但static数据成员的存储空间的建立不依赖于对象。更通俗来说,静态数据成员属于类,不属于对象。

class Tlass
{public:void set(int);static int num;
};
int Tlass::num = 0;        //定义静态数据成员void Tlass::set(int i)
{num = i;
}
int main()
{Tlass cla;cout << cla.num << endl;cla.set(5);cout << cla.num << endl;
}

同样地,在类中声明关键字public,private,protected可以实现约束作用。

2.静态成员函数

静态成员函数只能访问类的静态数据成员,他是一个不依赖于雷数据结构的共同操作,没有this指针。

class Tlass
{public:static void sta() { cout<<data<<endl; }
private:static int data;
};
int Tlass::data = 3;
int main()
{Tlass cla;cla.sta();Tlass::sta();  //用两种方式调用静态函数
}

三、友元

一个对象的私有成员,只能通过成员函数访问。我们可以通过定义友元来实现访问类的所有成员。友元可以是一个普通函数,成员函数,或者另一个类。友元不受在类中的声明位置的影响(public,private)。
友元函数是非对称的,非传递的。定义F是A的友元,但A不是F的友元;

1.友元函数

一段代码辅助理解:
代码计算了两个点之间的距离,将距离函数设置为类的友元函数。

#include<iostream>
using namespace std;class Point
{public:Point(int x, int y){xx = x;yy = y;}friend double distance(Point a, Point b);
private:int xx;int yy;
};double distance(Point a, Point b)
{return sqrt((a.xx - b.xx) * (a.xx - b.xx) + (a.yy - b.yy) * (a.yy - b.yy));
}int main()
{Point p1(3, 5);Point p2(0, 0);cout << distance(p1, p2);
}

2.友元类

若F类是A的友元类,F类中的所有成员函数都是A中的友元函数。在程序中,友元类一般设置为一种对数据操作或类之间传递信息的辅助类。
以下例子展示了通过B来访问A类中的函数。

#include<iostream>
using namespace std;class A {friend class B;
public:void Set(int a){ii = a;printii();}void printii(){cout << ii<<endl;cout << "printii finish";}
private:int ii;
};class B {public:A a;void set(int val){a.Set(val);}void print() {a.printii();}};int main()
{B b;b.set(1);b.print();
}

C++ 类与对象_类的其他成员(常成员,静态成员,友元)相关推荐

  1. C#类与对象_创建玩家类

    C#:类与对象_创建玩家类,实现字段,方法,引用和简单游戏逻辑 //创建CF当中的玩家类Player,该类含有字段:名字,性别, 血量,武器. //武器背包当中匕首,步枪,机枪,狙击枪. 玩家类具有以 ...

  2. 类和对象_月隐学python第15课

    目录 1 ⾯向对象的思想 2. 类和对象 2.1 类和对象的概念 2.2 类的定义​ 2.3 成员⽅法 2.4 对象的创建 2.5 成员属性 3 构造和析构 3.1 构造⽅法 3.2 析构⽅法 3.3 ...

  3. mysql构造器_类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库的方式--2018年8月30日11时38分...

    这一节课主要讲的是类和数据库的知识,主要是类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库1. 什么是类 ?什么是对象?举例说明 答:类是对象的模板,对象是类的一个实 ...

  4. java类与对象_Java类与对象

    类与对象 1,面向对象编程简介 Java语言最大的特点在于面向对象的编程设计,并且面向对象的编程设计也在由于Java自身的发展而不断发展.面向过程编程(C语言).函数式编程(Scala).面向对象编程 ...

  5. php函数、类和对象以及类的封装、继承、类的静态方法、静态属性

    php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 原文:php函数.类和对象以及类的封装.继承.类的静态方法.静态属性 1.函数 php内置函数可以直接使用,如果没有安装php扩展即可 ...

  6. 实验四 类和对象;类的继承和派生;多态性; 接口;构造器应用

    实验四 类和对象:类的继承和派生:多态性: 接口:构造器应用 一.实验目的 1. 掌握类与对象的关系: 2. 掌握类的定义: 3. 掌握对象的声明及使用: 4. 掌握构造方法的概念及调用时机: 5. ...

  7. c++类和对象(类的概念)

    1.类和对象概念 类:用来对实体(对象)进行描述,对象有什么属性,以及对象具有什么功能是一种自定义类型 对象:现实生活中所存在的 ,对象是对类的具体体现 用类类型创建出来的变量称为对象 2.类的定义 ...

  8. P4 类,对象,类成员简介

    1 什么是类 类是对现实世界事物进行抽象所得到的结果 事物包括"物质"(实体)与"运动"(逻辑) 建模是一个去伪存真.由表及里的过程 唯物主义辨证法对学习面向对 ...

  9. 04_类与对象_课程动手动脑问题以及课后实验性问题及解答集锦

    Answer: 动手动脑: 1--以下代码为何无法通过编译?哪儿出错了? Answer: 因为类Foo的构造函数是有一个参数的,所以我们在new一个Foo类的对象时必须赋予一个符合条件的实参. 2-- ...

最新文章

  1. 红帽、Docker、SUSE 在俄罗斯停服
  2. Hook技术之4 在自己的进程中注入一个Dll到别人的进程
  3. html需要电脑什么配置,配置一台电脑需要什么 选择配置一台好的台式电脑
  4. 最近看的篇文章,年过三十,感触很深
  5. java获取content-disposition_java – Content-Disposition附件不起作用 – 将...
  6. iptables_默认规则
  7. FetchType.LAZY和FetchType.EAGER什么区别?(懒加载和急加载的理解)
  8. VTK:Parallel之ExodusIIWriter
  9. 抖音xgorgon04参数
  10. Android之PhotoView使用(原创)
  11. G2.9 std_alloc源码剖析
  12. Spatial-Channel Sequeeze Excitation (SCSE)-8-June-2018【论文理解】
  13. HTML、CSS:基础知识
  14. Windows蓝屏代码大全及解决提示
  15. Pr_cc 学习笔记(二)鬼畜剪辑
  16. Cluster-based Beam Search for Pointer-Generator Chatbot Grounded by Knowledge
  17. 重磅!Apache RocketMQ 深圳沙龙报名开启!
  18. python爬虫excel数据_最简单的爬数据方法:Excel爬取数据,仅需6步
  19. 供应链协作平台产品设计思维导图
  20. 手机端 html5 按长按保存图片尺寸,html5移动端禁止长按图片保存的实现

热门文章

  1. Swift中方法的多面性
  2. Hazelcast源码剖析之Eviction
  3. 6-23 sdust-Java-可实现多种排序的Book类
  4. 2020东南大学网络空间安全复试经验分享
  5. 腾讯云购买服务器操作步骤
  6. 嵌入式系统中的电源管理
  7. MYSQL数据库跨服务器实时同步更新实践----文献阅读(污水管网水质预测)
  8. 信号的宽带和计算机网络的宽带有什么不同,路由器和调制解调器(宽带猫)有什么区别?...
  9. linux中分隔符IFS
  10. 第14章 LINQ to SOL