首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >类内部或外部的函数声明

类内部或外部的函数声明
EN

Stack Overflow用户
提问于 2012-01-31 15:30:21
回答 7查看 95.2K关注 0票数 99

我是一名试图学习C++的JAVA开发人员,但我真的不知道标准函数声明的最佳实践是什么。

在班级中:

代码语言:javascript
复制
class Clazz
{
 public:
    void Fun1()
    {
        //do something
    }
}

或外部:

代码语言:javascript
复制
class Clazz
{
public:
    void Fun1();
}

Clazz::Fun1(){
    // Do something
}

我有一种感觉,第二个可能不太好读…

EN

回答 7

Stack Overflow用户

发布于 2012-01-31 15:43:49

C++是面向对象的,因为它支持软件开发的面向对象范例。

然而,与Java语言不同的是,C++不会强制您在类中对函数定义进行分组:声明函数的标准C++方法是只声明一个函数,而不使用任何类。

相反,如果您谈论的是方法声明/定义,那么标准方法是将声明放入一个包含文件(通常命名为.h.hpp),将定义放入一个单独的实现文件(通常命名为.cpp.cxx)。我同意这确实有点烦人,需要一些重复,但这就是语言的设计方式。

对于快速实验和单个文件项目,任何东西都可以工作……但对于更大的项目,这种分离实际上是必需的。

注意:即使您了解Java,C++也是一种完全不同的语言……这是一种无法通过实验学习的语言。原因是它是一种相当复杂的语言,有很多不对称和明显不合逻辑的选择,最重要的是,当你犯了错误时,没有像Java那样的“运行时错误天使”来拯救你……但是有一些“未定义的行为守护进程”。

学习C++的唯一合理方法是通过阅读……无论你有多聪明,你都无法猜到委员会的决定(实际上聪明有时甚至是一个问题,因为正确的答案是不合逻辑的,也是历史传统的结果)。

只需挑选一两个good book,然后从头到尾地阅读它们。

票数 57
EN

Stack Overflow用户

发布于 2012-01-31 19:47:15

函数定义在类之外更好。这样,如果需要,您的代码可以保持安全。头文件应该只给出声明。

假设有人想使用你的代码,你可以给他你的类的.h文件和.obj文件(编译后获得)。他不需要.cpp文件就可以使用您的代码。

这样,其他任何人都看不到您的实现。

票数 21
EN

Stack Overflow用户

发布于 2013-10-14 13:09:44

“类内”(I)方法与“类外”(O)方法的作用相同。

但是,当一个类仅在一个文件(在.cpp文件中)中使用时,可以使用(I)。(O)在头文件中使用。cpp文件始终被编译。当你使用#include "header.h“时,头文件会被编译。

如果在头文件中使用(I),则每次包含#include "header.h“时都会声明函数(Fun1)。这可能导致多次声明相同的函数。这很难编译,甚至会导致错误。

正确用法示例:

File1:"Clazz.h“

代码语言:javascript
复制
//This file sets up the class with a prototype body. 

class Clazz
{
public:
    void Fun1();//This is a Fun1 Prototype. 
};

File2:"Clazz.cpp“

代码语言:javascript
复制
#include "Clazz.h" 
//this file gives Fun1() (prototyped in the header) a body once.

void Clazz::Fun1()
{
    //Do stuff...
}

File3:"UseClazz.cpp“

代码语言:javascript
复制
#include "Clazz.h" 
//This file uses Fun1() but does not care where Fun1 was given a body. 

class MyClazz;
MyClazz.Fun1();//This does Fun1, as prototyped in the header.

File4:"AlsoUseClazz.cpp“

代码语言:javascript
复制
#include "Clazz.h" 
//This file uses Fun1() but does not care where Fun1 was given a body. 

class MyClazz2;
MyClazz2.Fun1();//This does Fun1, as prototyped in the header. 

File5:"DoNotUseClazzHeader.cpp“

代码语言:javascript
复制
//here we do not include Clazz.h. So this is another scope. 
class Clazz
{
public:
    void Fun1()
    {
         //Do something else...
    }
};

class MyClazz; //this is a totally different thing. 
MyClazz.Fun1(); //this does something else. 
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9075931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档