返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++示例讲解friendstaticconst关键字的用法
  • 346
分享到

C++示例讲解friendstaticconst关键字的用法

2024-04-02 19:04:59 346人浏览 薄情痞子
摘要

目录一、友元函数1.1重载operator<<1.2友元函数1.3友元类二、关键字const2.1const修饰类的成员函数三、关键字static3.1static类成员

一、友元函数

1.1重载operator<<

问题:现在我们尝试去重载operator<<,然后发现我们没办法将operator<<重载成成员函数。因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作数了。但是实际使用中cout需要是第一个形参对象,才能正常使用。所以我们要将operator<<重载成全局函数。但是这样的话,又会导致类外没办法访问成员,那么这里就需要友元来解决。operator>>同理。

class Date
{
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{}
ostream& operator<<(ostream& _cout)
{
_cout<<d._year<<"-"<<d._month<<"-"<<d._day;
return _cout;
}
prvate:
int _year;
int _month;
int _day
};
int main()
{
Date d(2017, 12, 24);
d<<cout;
return 0;
}

但"d<<cout"可读性很低,所以我们尝试需要在类外部重载operator<<

1.2友元函数

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

class Date
{
friend ostream& operator<<(ostream& _cout, const Date& d);
friend istream& operator>>(istream& _cin, Date& d);
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
ostream& operator<<(ostream& _cout, const Date& d)
{
_cout<<d._year<<"-"<<d._month<<"-"<<d._day;
return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{
_cin>>d._year;
_cin>>d._month;
_cin>>d._day;
return _cin;
}
int main()
{
Date d;
cin>>d;
cout<<d<<endl;
return 0;

1.友元函数可访问类的私有和保护成员,但不是类的成员函数

2.友元函数不能用const修饰

3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制

4.一个函数可以是多个类的友元函数

5.友元函数的调用与普通函数的调用和原理相同

1.3友元类

1.友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

2.友元关系是单向的,不具有交换性。

比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。

3.友元关系不能传递如果B是A的友元,C是B的友元,则不能说明C时A的友元。

class Date; // 前置声明
class Time
{
friend class Date; // 声明日期类为时间类的友元类,则在日期类中就直接访问Time类中的私有成
员变量
public:
Time(int hour, int minute, int second)
: _hour(hour)
, _minute(minute)
, _second(second)
{}
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
: _year(year)
, _month(month)
, _day(day)
{}
void SetTimeOfDate(int hour, int minute, int second)
{
// 直接访问时间类私有的成员变量
_t._hour = hour;
_t._minute = minute;
_t.second = second;
}
private:
int _year;
int _month;
int _day;
Time _t;
};

二、关键字const

2.1const修饰类的成员函数

将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

总结:

1.const对象不能调用非cosnt成员函数(权限放大:const Date* -> Date*)

2.非const对象可以调用const成员函数

3.const成员函数不能调用非cosnt成员函数(权限放大)

4.非cosnt成员函数可以调用const成员函数

三、关键字static

3.1static类成员

概念:声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化

特性:

  • 静态成员为所有类对象所共享,不属于某个具体的实例
  • 静态成员变量必须在类外定义,定义时不添加static关键字
  • 类静态成员即可用类名::静态成员或者对象.静态成员来访问
  • 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  • 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值

3.2面试

面试题:实现一个类,计算中程序中创建出了多少个类对象。

class A
{
public:
A() {++_scount;}
A(const A& t) {++_scount;}
static int GetACount() { return _scount;}
private:
static int _scount;
};
int A::_count = 0;
void TestA()
{
cout<<A::GetACount()<<endl;
A a1, a2;
A a3(a1);
cout<<A::GetACount()<<endl;
}

注意:

1.静态成员函数不能调用非静态成员函数

2.非静态成员函数可以调用静态成员函数

总结

以上就是关于c++关键字friend ,static,const 全部总结,感谢大家的阅读观看

到此这篇关于C++示例讲解friend static const关键字的用法的文章就介绍到这了,更多相关C++ friend static const内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++示例讲解friendstaticconst关键字的用法

本文链接: https://lsjlt.com/news/151812.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++示例讲解friendstaticconst关键字的用法
    目录一、友元函数1.1重载operator<<1.2友元函数1.3友元类二、关键字const2.1const修饰类的成员函数三、关键字static3.1static类成员...
    99+
    2024-04-02
  • C/C++举例讲解关键字的用法
    目录staticstatic修饰全局变量static修饰局部变量static修饰函数constBOOLbreakcontinuestatic static修饰全局变量 static修...
    99+
    2024-04-02
  • C/C++ extern关键字用法示例全面解析
    目录前言一般用法在本模块中使用:跨模块中extern 使用过程中的一些注意事项数组与指针的区别extern 声明全局变量的内部实现extern "C"C和C++互...
    99+
    2023-01-04
    C/C++ extern关键字 C/C++ extern
  • C++explicit关键字讲解
    目录1 隐式转换2 显示转换前言: C++编码时,可以通过构造函数将相应的数据类型转换成为C++类的对象,从某种程度来说给编码带来了方便,但并不是每次都正确,为了避免这种情况,C++...
    99+
    2024-04-02
  • C语言实例梳理讲解常用关键字的用法
    目录一、C语言关键字详解1. sizeof2. const3. static4. extern5. volatile6. typedef7. enum8. continue9. br...
    99+
    2024-04-02
  • C#中using关键字的使用方法示例
    目录1 :using 指令(命名空间)2 :using 语句(1 ):using (ResourceType Identifier = Expression ) State...
    99+
    2024-04-02
  • Java中instanceof关键字实例讲解
    目录1.向上转型 向下转型2.强制类型转换的应用3.instanceof 关键字使用4.测试举例5.强制类型转换成功总结1.向上转型 向下转型 2.强制类型转换的应用 应用多态性时...
    99+
    2024-04-02
  • C++深入讲解namespace与string关键字的使用
    目录namespace1.为什么使用namespace2.namespace的定义3.namespace的使用4.使用using指示符string1.string的定义及初始化2.访...
    99+
    2024-04-02
  • C++深入讲解new与deleted关键字的使用
    目录可执行程序的虚拟地址空间1.new的运算符用法(关键字)2.new的函数用法3.定位new4.new创建对象5.delete6.对于内置类型new/delete/malloc/f...
    99+
    2024-04-02
  • vue中的搜索关键字实例讲解
    目录vue的搜索关键字1、定义一个搜索框2、循环遍历,之前3、在data中,我们写入如下数据4、在methods中5、我们还可以这样写搜索功能及搜索结果关键字高亮首先实现搜索功能通过...
    99+
    2024-04-02
  • C语言volatile关键字的作用与示例
    目录写在前面volatile和内联汇编的volatile的选择写在前面 版本信息:Linux操作系统,x86架构,Linux操作系统下GCC9.3.1版本。GCC 9.3.0手册。 ...
    99+
    2023-05-15
    C语言volatile关键字 C语言volatile
  • c++关键字const的用法详解
    目录C语言const的用法1、指向常量的指针变量const int *p指针指向int a;2、常指针(常地址)int * const p指针指向int a;3、指向常量的常指针co...
    99+
    2024-04-02
  • C语言学习之关键字的示例详解
    目录1. 前言2. 什么是关键字3. extern-声明外部符号4. auto-自动5. typedef-类型重定义(类型重命名)6. register-寄存器6.1 存储器6.2 ...
    99+
    2022-11-13
    C语言 关键字
  • C语言中volatile关键字的深入讲解
    1. 什么是volatile关键字? volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译、读取、存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储...
    99+
    2024-04-02
  • C语言详细分析讲解关键字const与volatile的用法
    目录一、const 只读变量二、const 全局变量的分歧三、const 的本质四、const 修饰函数参数和返回值五、volatile 解析六、小结一、const 只读变量 con...
    99+
    2024-04-02
  • 讲解Python 中的 with 关键字
    我们中的许多人在 Python 代码中一遍又一遍地看到这个代码片段: with open('Hi.text', 'w') as f: f.write("Hello, ther...
    99+
    2024-04-02
  • Java中的Native关键字讲解
    目录一、Java中Native关键字的语法二、Native关键字是如何工作的?三、代码示例四、Java中Native关键字的优势五、规则六、总结前言: native关键字充当JAVA...
    99+
    2024-04-02
  • Verilog语言关键字模块例化实例讲解
    目录关键字:例化,generate,全加器,层次访问命名端口连接顺序端口连接端口连接规则用 generate 进行模块例化层次访问关键字:例化,generate,全加器,层次访问 ...
    99+
    2023-05-15
    Verilog语言关键字模块例化 Verilog 模块例化
  • SQL中关键字的使用示例
    这篇文章主要介绍了SQL中关键字的使用示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。起别名在实际的项目中,有时候我们的表名、字段名过于复...
    99+
    2024-04-02
  • C#中ref关键字的用法
    在C#中,如果在方法参数前面加上ref关键字,说明参数传递的是引用,而不是值。如何理解呢? 参数是简单类型的例子 static void Main(string[] ...
    99+
    2022-11-13
    C# ref关键字
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作