1.c++中的this指针

指向当前对象,通过它可以访问当前对象的所有成员。当前对象就是正在使用的对象;
在类的内部使用,可以访问所有的成员,public,private,protect

this只能在非静态成员函数内部使用,在其他地方非法;
this 只能在对象创建以后才能使用;否则非法;

2.友元函数

1.)一个类中可以有 public、protected、private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员。现在,我们来介绍一种例外情况——友元(friend)。借助友元(friend),可以使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成员。

fnend 的意思是朋友,或者说是好友,与好友的关系显然要比一般人亲密一些。我们会对好朋友敞开心扉,倾诉自己的秘密,而对一般人会谨言慎行,潜意识里就自我保护。在C++中,这种友好关系可以用 friend 关键字指明,中文多译为“友元”,借助友元可以访问与其有好友关系的类中的私有成员。如果你对“友元”这个名词不习惯,可以按原文 friend 理解为朋友。
友元函数

在当前类以外定义的、不属于当前类的函数也可以在类中声明,但要在前面加 friend 关键字,这样就构成了友元函数。友元函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数。

友元函数可以访问当前类中的所有成员,包括 public、protected、private 属性的。

#include <iostream>
using namespace std;class student {
private:char *m_name;int m_age;float m_score;
public :student(char *name, int age, float score);//friend void show(student *ptr);friend void show(student ptr);      //这两种方式都是可以的。
};student :: student(char *name, int age, float score):m_name(name), m_age(age), m_score(score){}/*void show(student *ptr)
{cout<<ptr->m_name<<","<<ptr->m_age<<","<<ptr->m_score<<endl;
}*/void show(student ptr)
{cout<<ptr.m_name<<","<<ptr.m_age<<","<<ptr.m_score<<endl;
}int main()
{student stu("xiaosu", 21, 99.6);show(stu);//shoe(&stu);return 0;
}

注意,友元函数不同于类的成员函数,在友元函数中不能直接访问类的成员,必须要借助对象。下面的写法是错误的:
纯文本复制
void show(){
    cout<<m_name<<"的年龄是 "<<m_age<<",成绩是 "<<m_score<<endl;
}

2) 将其他类的成员函数声明为友元函数

#include <iostream>
using namespace std;class address;//先声明address类,不然11行会报错,报错信息 错误:‘address’ 未声明class student {    //声明student类
private:char *m_name;int m_age;float m_score;
public :student(char *name, int age, float score);void show(address *addr);
};class address {        //声明address类
private:char *m_province;char *m_city;char *m_district;
public:address(char *province, char *city, char *district);friend void student :: show(address *addr);  //将student类中的成员函数show()声明为友元函数
};student :: student(char *name, int age, float score):m_name(name), m_age(age), m_score(score){}address :: address(char *province, char *city, char *district):m_province(province), m_city(city), m_district(district){}void student :: show(address *addr)
{cout<<m_name<<","<<m_age<<","<<m_score<<endl;cout<<addr->m_province<<","<<addr->m_city<<","<<addr->m_district<<endl;
}int main()
{student stu("xiaosu", 21, 99.6);address addr("jiangsu", "nanjing", "jiangning");stu.show(&addr);student *pstu = new student("xiaowang", 16, 95.6);address *paddr = new address("jiangsu", "suqian", "siyang");pstu->show(paddr);return 0;
}

3).友元类

不仅可以将一个函数声明为一个类的“朋友”,还可以将整个类声明为另一个类的“朋友”,这就是友元类。友元类中的所有成员函数都是另外一个类的友元函数。
例如将类 B 声明为类 A 的友元类,那么类 B 中的所有成员函数都是类 A 的友元函数,可以访问类 A 的所有成员,包括 public、protected、private 属性的。

class Address;  //提前声明Address类
//声明Student类
class Student{
public:Student(char *name, int age, float score);
public:void show(Address *addr);
private:char *m_name;int m_age;float m_score;
};
//声明Address类
class Address{
public:Address(char *province, char *city, char *district);
public://将Student类声明为Address类的友元类friend class Student;
private:char *m_province;  //省份char *m_city;  //城市char *m_district;  //区(市区)
};

其余的代码和之前的例子差不多。
关于友元,有两点需要说明:
友元的关系是单向的而不是双向的。如果声明了类 B 是类 A 的友元类,不等于类 A 是类 B 的友元类,类 A 中的成员函数不能访问类 B 中的 private 成员。
友元的关系不能传递。如果类 B 是类 A 的友元类,类 C 是类 B 的友元类,不等于类 C 是类 A 的友元类。

初入c++(三)this指针,友元函数,友元类相关推荐

  1. C++笔记 友元函数 友元类

    友元函数 :友元函数是可以直接访问类的私有成员的非成员函数. 它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:     ...

  2. 友元函数、类的非静态成员函数、静态成员函数的区别

    类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...

  3. 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

     1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...

  4. 友元函数 友元类 友元成员函数

    友元 一般来说,类内的私有数据是对外不可见的,但在有些情况下,我们需要在类外对该类的私有数据进行访问,这就需要用到一种新技术--友元(friend),即在声明前添加关键字friend. 友元关系是单向 ...

  5. 初入c++(六)虚函数实现多态,虚析构函数,虚函数表和多态实现机制,纯虚函数。

    1.c++多态的概念以及用途. 1.1虚函数实现多态 通过基类指针只能够访问派生类的成员变量,不能够访问派生类的成员函数. 解决问题的办法:使用虚函数(virtual function),只需要在函数 ...

  6. 【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )

    文章目录 成员函数 常量函数 友元函数 new 创建对象 友元类 单例类 成员函数 此处继续上一篇博客继续向后讲解C++面向对象 类成员方法 , 除了定义构造方法与析构方法之外 , 还可以定义普通的成 ...

  7. c++ 友元函数,友元类

    友元函数破坏了类的封装特性,它可以在类的外部访问类的私有属性 #include "iostream" using namespace std; class A1 { public: ...

  8. C++的友元函数,友元类及#pragma once的作用

    把代码都放最后吧 友元函数的作用: 可以访问该类的私有属性 但在类的外面定义的时候没有"类::" 所以该友元函数不属于该类 友元函数的意义: C++友元函数_Bussy的博客-CS ...

  9. C++——运算符的重载---以成员函数方式重载---以友元函数方式重载

    一.运算符的重载 1.运算符的重载 允许把标准运算符(如+ - * /等运算符)应用于自定义数据类型的对象,可以提高程序的可读性,运算符的重载本质上还是函数重载.运算符仅仅是语法上的方便,它是另一种函 ...

  10. 关于C++中的友元函数的总结

    1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具 ...

最新文章

  1. 关于使用python logging模块的几点总结
  2. 这5种动态炫酷图,用Python就可以画!
  3. 偏微分方程I PDE的例子1 一维波动与热传导方程
  4. php伪静态框架,Nginx之php框架常见伪静态rewrite配置
  5. ITK:将vtkImageData转换为itk :: Image
  6. 2010502260926_《avolon》
  7. python中iter是什么意思_python iter()与 __iter__()的区别
  8. pdg转pdf的正确方法!!
  9. linux/ubuntu16.04系统上snowboy swig源码安装及使用全记录和遇到的错误
  10. 惊艳的成长计划表刷屏!武大首位 94 年博士入职华为,年薪达 201 万
  11. (C++)输入两个正整数m和n,求其最大公约数和最小公倍数(辗转相除法)
  12. 我们如何走到今天:重塑世界的6项创新
  13. 英特尔前任 CEO 安迪·格鲁夫的传奇一生
  14. 录屏软件 ev录屏 安装与使用教程 教学演示视频提问必会的软件
  15. Jquery选择器:通过class名获取ID
  16. LVS的模式一:DR(直接路由)模式
  17. 开题报告里的基本内容写什么,预期效果又怎么写?
  18. 各个版本的Xcode/IOS SDK官网下载
  19. pycharm出现low memory警告,卡顿
  20. 有向图邻接矩阵c语言编程,邻接矩阵有向图(一)之 C语言详解

热门文章

  1. QTcrateor 编译 ROS
  2. 计算机科学研究方向介绍
  3. 又出问题!特斯拉回应384万天价充电费:系统错误,正在修复
  4. 苹果折叠屏iPhone不会在明年推出 最快2025年出货
  5. 抖音音乐品牌升级 推出“炙热星河”音乐人服务平台
  6. 国产特斯拉Model Y已开始向欧洲用户交付
  7. 罗永浩“真还传”再出番外篇,被执行1800万,交个朋友回应来了…
  8. 两年不工作、月花200块,90后躺平学大师已有了一批「信徒」
  9. 滴滴回应上班高峰期大范围崩溃 :系统异常 订单差额部分统一退还
  10. 张朝阳:搜狐Q3广告业务稳健游戏业务超预期 有望全年实现盈利