c++常见问题 3

什么是友元?友元的存在形式有?友元有何特点?

友元(friend)是一种定义在类外部的普通函数或类,但他需要的类体内进行说明。友元不是成员函数,但他可以访问类中的私有成员

友元提供了一种普通函数或者类成员函数,访问另一个类型中的私有或者保护成员的机制。也就是说有两种形式的友元
1.友元函数(成员函数):普通函数对一个访问某个类中的私有或者保护成员
2.友元类:类a中的成员函数访问类b中的私有或保护成员
3.普通函数自由函数:

友元的特点:提高了程序的运行效率,但破环了数据的透明性和类的封装性,但c++将友元的使用限制在一定范围内,它是单向的,不具备传递性,不能被继承。

运算符重载的原则是什么?有哪些规则?

实质上它的本质是是函数重载或函数多态,运算符重载是一种形式的c++多态。目的在于能让人能够用同名的函数来完成不同的基本操作。

规则:

  1. 为了防止用户对标准类型进行运算符重载,成c++规定重载的运算符的操作第项必须至少有一个是自定义类型或者枚举类型
  2. 重载运算符之后,其优先级和结合性还是固定不变的
  3. 重载不会改变运算符的用法,原理有集个操作数,操作数在左边还是在右边这些都不会改变
  4. 重载运算符函数不能有默认参数,否则会导致操作数的个数改变。
  5. 重载逻辑运算符(&&,||)后,不再具备短路求值特性
  6. 不能找一个并不存在的运算符,如@、$等。

不能重载的运算符有哪几个?

在 C++ 中,有几个运算符是不能被重载的,它们分别是:

  1. 成员访问运算符(.)
  2. 成员指针访问运算符(.*)
  3. 作用域解析运算符(::)
  4. 条件运算符(?:)
  5. sizeof 运算符
  6. typeid 运算符

自增运算符的前置形式和后置形式有什么区别?返回值类型分别是什么?

前置形式不需要传入任何参数,它直接修改对象的值,并返回对象本身的引用。这种形式的效率更高,因为它不需要创建临时变量或者复制对象。例如:

// 前置递增(++i)
MyClass& operator++()
{
    // 修改对象的值
    ++value;
    // 返回对象本身的引用
    return *this;
}

后置形式需要传入一个 int 类型的参数,但实际上这个参数只是用来区分前置形式和后置形式,不会被真正使用。后置形式首先将对象的值存储到一个临时变量中,然后再将对象的值加一,并最终返回这个临时变量的值。因此,它的效率相对较低,因为它需要创建临时变量并进行赋值操作。例如:


// 后置递增(i++)
MyClass operator++(int)
{
    // 创建临时变量并保存对象的值
    MyClass tmp(*this);
    // 将对象的值加一
    ++value;
    // 返回保存的临时变量
    return tmp;
}

总之,前置形式的效率更高,但是需要返回对象本身的引用;后置形式的效率相对较低,但可以返回一个新创建的临时变量。在实际使用中,应根据具体需求选择适合的形式进行重载。

你可能感兴趣的:(c++,c++,开发语言)