嵌入式C++开发详解(六)

运算符重载

一、友元机制

1.友元介绍

·友元是一种允许非类成员函数访问类的非公有成员的一种机制

·可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。

   友元函数

   友元类

2.友元函数

·友元函数在类作用域外定义,但它需要在类体中进行说明

·为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下:

      friend 类型  友元函数名(参数表)

友元的作用在于提高程序的运行效率

友元函数的注意事项:

·友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。但友元函数可以访问类中的所有成员(公有的、私有的、保护的),一般函数只能访问类中的公有成员。

·友元函数不受类中的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样。

·某类的友元函数的作用域并非该类作用域。如果连友元函数不是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。

·友元函数破坏了面向对象程序类的封装性,所有友元函数如不是为了必须使用则尽可能少用。或者用其他手段保护封装性。

3.友元类

友元类的注意事项:

·友元关系是单向的

·友元关系不能被传递

·友元关系不能被继承

代码示例:

String.h;
#ifndef _STRING_H_
#define _STRING_H_
 
class String
{
public:
    friend class StringTool;
friend void print(const String &s1);  //友元函数
String();
String(char *str);
~String();
void Display();
private:
char *str_;
 
};
#endif
String.cpp:
#include <iostream>
#include "String.h"
 
using namespace std;
 
String::String()
{
cout << "default constructor String!" << endl;
}
String::String(char *str)
{
cout << "constructor String" << endl;
int len = strlen(str) + 1;
str_ = new char(len);
memset(str_, 0, len);
strcpy(str_, str);
}
 
String :: ~String()
{
cout << "destory String" << endl;
}
 
void String::Display()
{
cout << str_ << endl;
}
 
void print(const String& s1)//友元函数
{
cout << s1.str_ << endl;
}
 
StringTool.h:
#ifndef _STRINGTOOL_H_
#define _STRINGTOOL_H_
#include "String.h"
 
class StringTool
{
public:
void mystrcat(String& s1, String& s);
};
 
#endif
StringTool.cpp:
#include <iostream>
#include <string.h>
#include "StringTool.h"
 
void StringTool::mystrcat(String &s1, String &s)
{
strcat(s1.str_, s.str_);
}
 
main.c:
#include <iostream>
#include "String.h"
#include "StringTool.h"
using namespace std;
 
int main()
{
String s1("hello");
print(s1);
//String s2("world");
//StringTool st;
//st.mystrcat(s1, s2);//调用友元类
 
return 0;
}

运行结果:


二、运算符重载

1.运算符重载介绍

·运算符重载允许把标准运算符(如+*/<>等)应用于自定义数据类型的对象

运算符重载的作用

·直观自然,可以提高程序的可读性

·体现了C++的可扩充性

·运算符重载仅仅只是为了语法上的方便,它是另一种函数调用方式

·运算符重载,本质上是函数重载

运算符重载的注意事项:

·不要滥用重载,本质上是函数重载

2.运算符重载的实现

(1)成员函数重载

  · 成员函数原型格式:

     函数类型 operator 运算符(参数表);

  ·成员函数定义的格式:

     函数类型 类名 :: operator 运算符(参数表)

     {

         函数体;

     }

(2)友元函数重载

  ·友元函数原型的格式:

friend 函数类型 operator运算符(参数表);

  ·友元函数定义的格式:

函数类型 函数类型 类名::operator 运算符(参数表)

{

    函数体;

}

3.运算符重载规则

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入式Linux系统开发技术是一个较为广泛的领域,其中以基于ARM的嵌入式系统应用较为常见。嵌入式Linux系统的开发技术可以涵盖从硬件平台的选择到Linux内核的移植,再到应用程序的开发等方面。以下是关于嵌入式Linux系统开发技术的详细解释。 硬件平台选择:首先需要进行硬件平台的选择,确定嵌入式设备所需的处理器、内存、存储等组件规格。由于ARM架构的设计优势,小型化、低功耗、价格实惠等特点,ARM处理器得到了广泛应用,并成为最受欢迎的嵌入式处理器之一。因此,选择基于ARM架构的嵌入式平台也成为了最常见的选择。 移植Linux内核:对于选择的硬件平台,需要进行Linux内和的移植,这样才能在嵌入式设备上运行Linux系统。有关ARM平台的内核移植,需要一个交叉编译工具链,以允许在主机上编译ARM平台的内核。内核移植大量依赖高级的交叉编译技术,需要深入了解编译规则、配置文件修改和编译选项等技术。 设备驱动开发:设备驱动是嵌入式Linux系统最重要的核心内容之一,负责管理外部设备。设备驱动的编写第一要件是了解设备硬件特性,需要具备一定的硬件电路知识。对于具体的外设需要进行详细的驱动开发,如磁盘驱动、键盘驱动等。 应用程序开发:完成内核移植和设备驱动的编码后,紧接着就是应用程序的开发嵌入式Linux系统的应用程序需要根据具体需求进行开发,在编写过程中需要对硬件资源的使用和管理进行严格考虑,避免出现内存泄漏、死锁、内核过载等问题。因此,对C/C++开发技术的掌握是优秀的嵌入式Linux系统应用程序开发必不可少的能力。 综上所述,嵌入式Linux系统开发涉及硬件平台的选择、内核移植、设备驱动开发和应用程序开发等多个方面。在基于ARM的嵌入式系统应用中,Linux内核的移植是关键步骤,需要学习交叉编译技术,硬件驱动开发和应用程序开发也同样重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值