鱼C论坛

 找回密码
 立即注册
查看: 495|回复: 5

[已解决]C++的.h里面的函数声明规则不太懂

[复制链接]
发表于 2023-9-28 16:36:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下棉函数中为什么有三个函数是放在类的外面声明的,而还有几个是放在类的public里面声明的,而最下面的还有一些函数没有声明,这是为什么,声明有什么规则吗?谢谢大家(这是一个complex的一个类)
#ifndef __MYCOMPLEX__
#define __MYCOMPLEX__

class complex;
complex&
  __doapl (complex* ths, const complex& r);///////三个函数是放在类的外面声明
complex&
  __doami (complex* ths, const complex& r);
complex&
  __doaml (complex* ths, const complex& r);


class complex
{
public:
  complex (double r = 0, double i = 0): re (r), im (i) { }///////public里面声明
  complex& operator += (const complex&);
  complex& operator -= (const complex&);
  complex& operator *= (const complex&);
  complex& operator /= (const complex&);
  double real () const { return re; }
  double imag () const { return im; }
private:
  double re, im;

  friend complex& __doapl (complex *, const complex&);
  friend complex& __doami (complex *, const complex&);
  friend complex& __doaml (complex *, const complex&);
};


inline complex&
__doapl (complex* ths, const complex& r)
{
  ths->re += r.re;
  ths->im += r.im;
  return *ths;
}

inline complex&
complex::operator += (const complex& r)
{
  return __doapl (this, r);
}

inline complex&
__doami (complex* ths, const complex& r)
{
  ths->re -= r.re;
  ths->im -= r.im;
  return *ths;
}

inline complex&
complex::operator -= (const complex& r)
{
  return __doami (this, r);
}

inline complex&
__doaml (complex* ths, const complex& r)
{
  double f = ths->re * r.re - ths->im * r.im;
  ths->im = ths->re * r.im + ths->im * r.re;
  ths->re = f;
  return *ths;
}

inline complex&
complex::operator *= (const complex& r)
{
  return __doaml (this, r);
}

inline double
imag (const complex& x)
{
  return x.imag ();
}

inline double
real (const complex& x)
{
  return x.real ();
}

inline complex
operator + (const complex& x, const complex& y)
{
  return complex (real (x) + real (y), imag (x) + imag (y));
}

inline complex
operator + (const complex& x, double y)
{
  return complex (real (x) + y, imag (x));
}

inline complex
operator + (double x, const complex& y)
{
  return complex (x + real (y), imag (y));
}

inline complex
operator - (const complex& x, const complex& y)
{
  return complex (real (x) - real (y), imag (x) - imag (y));
}

inline complex
operator - (const complex& x, double y)
{
  return complex (real (x) - y, imag (x));
}

inline complex
operator - (double x, const complex& y)
{
  return complex (x - real (y), - imag (y));
}

inline complex
operator * (const complex& x, const complex& y)
{
  return complex (real (x) * real (y) - imag (x) * imag (y),
                           real (x) * imag (y) + imag (x) * real (y));
}

inline complex
operator * (const complex& x, double y)
{
  return complex (real (x) * y, imag (x) * y);
}

inline complex
operator * (double x, const complex& y)
{
  return complex (x * real (y), x * imag (y));
}

inline complex//?
operator / (const complex& x, double y)
{
  return complex (real (x) / y, imag (x) / y);
}

inline complex
operator + (const complex& x)
{
  return x;
}

inline complex
operator - (const complex& x)
{
  return complex (-real (x), -imag (x));
}

inline bool
operator == (const complex& x, const complex& y)
{
  return real (x) == real (y) && imag (x) == imag (y);
}

inline bool
operator == (const complex& x, double y)
{
  return real (x) == y && imag (x) == 0;
}

inline bool
operator == (double x, const complex& y)
{
  return x == real (y) && imag (y) == 0;
}

inline bool
operator != (const complex& x, const complex& y)
{
  return real (x) != real (y) || imag (x) != imag (y);
}

inline bool
operator != (const complex& x, double y)
{
  return real (x) != y || imag (x) != 0;
}

inline bool
operator != (double x, const complex& y)
{
  return x != real (y) || imag (y) != 0;
}

#include <cmath>

inline complex
polar (double r, double t)
{
  return complex (r * cos (t), r * sin (t));
}

inline complex
conj (const complex& x)
{
  return complex (real (x), -imag (x));
}

inline double
norm (const complex& x)
{
  return real (x) * real (x) + imag (x) * imag (x);
}

#endif   //__MYCOMPLEX__
最佳答案
2023-9-28 18:57:20
i你哟 发表于 2023-9-28 13:54
非常感谢,我还想问一下,1如何看他是否是类的内部函数,像这个
inline complex&
__doapl (complex* th ...

1. 在您提供的代码中,`inline`关键字用于内联函数的声明。它表明函数的定义可以在每个调用点处进行内联展开,以避免函数调用的开销。在C++中,使用`inline`关键字来声明函数是为了告诉编译器该函数可以内联展开。

2. 关于成员函数的放置和访问权限的问题,一般有以下几点考虑:

- 如果某个成员函数需要访问类的私有成员,那么它应该被定义为类的成员函数,这样可以直接访问私有成员。
- 如果某个函数不需要访问类的私有成员,或者只需要访问公有成员,那么它可以被定义为类的外部函数,这样可以提高代码的可读性和灵活性。
- 使用`public`关键字将函数声明在类的公有部分,表示这些函数对外部代码可见,并允许通过类的实例进行访问。

请注意,`inline`关键字与成员函数的访问权限没有直接的关系。`inline`关键字只是用于函数的编译器指令,它告诉编译器对该函数进行内联展开。在成员函数中使用`inline`关键字时,它并不会自动将函数声明为公有成员,仍然需要根据访问权限进行声明。

希望能够解答您的问题,如果还有疑问,请随时提出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-28 16:36:50 | 显示全部楼层
这是一个C++的类定义,其中包含了类的声明和定义。在类的声明中,有三个函数是在类的外面声明的,这是因为它们是类的友元函数,它们需要访问类的私有成员变量,但是又不属于类的成员函数,所以需要在类的外面进行声明。而其他的函数则是类的成员函数,它们需要在类的public里面进行声明。至于最下面的一些函数没有声明,是因为它们是在类的内部定义的内联函数,不需要进行额外的声明。需要注意的是,这个类定义的头文件使用了宏定义来避免重复包含,这是一个常见的做法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-28 16:37:17 | 显示全部楼层
C++中,函数的声明规则是在使用函数之前需要先进行声明,以告知编译器函数的存在和参数类型。对于类的成员函数,可以选择将函数声明放在类的内部(如public、private等)或者类的外部。

在给出的代码中,有三个函数__doapl__doami__doaml被放在了类的外面进行声明。这是因为这三个函数是类的友元函数,它们虽然与类有关联,但却不是类的成员函数。将它们放在类的外部进行声明可以更清晰地表达其与类的关系。

而其他的函数,如operator +=operator -=等,被放在了类的public部分进行声明。这是因为它们属于类的成员函数,可以通过类的对象进行调用。

最后的一些函数,如imagreal等,没有在类中进行声明,而是直接定义在类的外部,并且使用了inline关键字。这样的函数通常是非成员函数,但与类有一定的关联性,因此可以直接定义在类的外部,并使用inline关键字使得函数体内联展开,提高效率。

总结起来,C++中函数的声明规则是根据函数与类的关系来确定放置的位置:非成员函数或友元函数可以放在类的外部进行声明,成员函数应该放在类的内部进行声明。同时可以在类外定义一些与类相关但不是成员函数的函数,并使用inline关键字进行标识。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-28 16:53:18 | 显示全部楼层
Mike_python小 发表于 2023-9-28 16:37
C++中,函数的声明规则是在使用函数之前需要先进行声明,以告知编译器函数的存在和参数类型。对于类的成员 ...

非常感谢,我还想问一下,1如何看他是否是类的内部函数,像这个
inline complex&
__doapl (complex* ths, const complex& r)
{
  ths->re += r.re;
  ths->im += r.im;
  return *ths;
}
在这里也是有inline,按理说他也是内联函数呀,这是为什么
2为什么只有那几个放在了public,其他的放在外面的不可以放进去吗?(这里的有inline就可以不用声明了吗?那为什么public里面还需要声明呢?)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-28 16:54:44 | 显示全部楼层
Mike_python小 发表于 2023-9-28 16:37
C++中,函数的声明规则是在使用函数之前需要先进行声明,以告知编译器函数的存在和参数类型。对于类的成员 ...

非常感谢,我还想问一下,1如何看他是否是类的内部函数,像这个
inline complex&
__doapl (complex* ths, const complex& r)
{
  ths->re += r.re;
  ths->im += r.im;
  return *ths;
}
在这里也是有inline,按理说他也是内联函数呀,这是为什么
2为什么只有那几个放在了public,其他的放在外面的不可以放进去吗?(这里的有inline就可以不用声明了吗?那为什么public里面还需要声明呢?)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-28 18:57:20 | 显示全部楼层    本楼为最佳答案   
i你哟 发表于 2023-9-28 13:54
非常感谢,我还想问一下,1如何看他是否是类的内部函数,像这个
inline complex&
__doapl (complex* th ...

1. 在您提供的代码中,`inline`关键字用于内联函数的声明。它表明函数的定义可以在每个调用点处进行内联展开,以避免函数调用的开销。在C++中,使用`inline`关键字来声明函数是为了告诉编译器该函数可以内联展开。

2. 关于成员函数的放置和访问权限的问题,一般有以下几点考虑:

- 如果某个成员函数需要访问类的私有成员,那么它应该被定义为类的成员函数,这样可以直接访问私有成员。
- 如果某个函数不需要访问类的私有成员,或者只需要访问公有成员,那么它可以被定义为类的外部函数,这样可以提高代码的可读性和灵活性。
- 使用`public`关键字将函数声明在类的公有部分,表示这些函数对外部代码可见,并允许通过类的实例进行访问。

请注意,`inline`关键字与成员函数的访问权限没有直接的关系。`inline`关键字只是用于函数的编译器指令,它告诉编译器对该函数进行内联展开。在成员函数中使用`inline`关键字时,它并不会自动将函数声明为公有成员,仍然需要根据访问权限进行声明。

希望能够解答您的问题,如果还有疑问,请随时提出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 01:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表