c++ - C++ 中的编码实践,您的选择是什么,为什么?

标签 c++ coding-style

我有一个大对象 MyApplicationContext,它保存有关 MyApplication 的信息,例如名称、路径、登录信息、描述、详细信息等。

//MyApplicationCtx

class MyApplicationCtx{
       // ....
    private:
        std::string name;
        std::string path;
        std::string desciption;
        struct loginInformation loginInfo;
        int appVersion;
        std::string appPresident;
        //others
}

这是我的方法 cloneApplication(),它实际上设置了一个新的应用程序。如代码 1 和代码 2 所示,有两种方法可以做到这一点。我应该更喜欢哪一种,为什么?

//代码1

public void cloneApplication(MyApplicationCtx appObj){
    setAppName(appObj);
    setAppPath(appObj);
    setAppAddress(&appObj); // Note this address is passed
    setAppDescription(appObj);
    setAppLoginInformation(appObj);
    setAppVersion(appObj);
    setAppPresident(appObj);
}

public void setAppLoginInformation(MyApplicationCtx appObj){
    this->loginInfo = appObj.loginInfo; //assume it is correct
}

public void setAppAddress(MyApplicationCtx *appObj){
    this->address = appObj->address;
}

 .... // same way other setAppXXX(appObj) methods are called.

Q1. 每次传递大对象 appObj 是否会对性能产生影响?

Q2.如果我使用引用传递它,对性能有什么影响?

public void setAppLoginInformation(MyApplicationCtx &appObj){ 
    this->loginInfo = appObj.loginInfo;
}

//代码2

public void setUpApplication(MyApplicationCtx appObj){
    std::string appName;
    appName += appOj.getName();
    appName += "myname";
    setAppName(appName);

    std::string appPath;
    appPath += appObj.getPath();
    appPath += "myname";
    setAppPath(appPath);

    std::string appaddress;
    appaddress += appObj.getAppAddress();
    appaddress += "myname";
    setAppAddress(appaddress); 

    ... same way setup the string for description and pass it to function
    setAppDescription(appdescription);

    struct loginInformation loginInfo = appObj.getLoginInfo();
    setAppLoginInformation(loginInfo);

    ... similarly appVersion
    setAppVersion(appVersion);
    ... similarly appPresident
    setAppPresident(appPresident);
}

Q3.比较代码1和代码2,我应该使用哪一个?我个人喜欢代码 1

最佳答案

你最好定义一个 Copy Constructor和一个 Assignment Operator :

// Note the use of passing by const reference!  This avoids the overhead of copying the object in the function call.
MyApplicationCtx(const MyApplicationCtx& other);
MyApplicationCtx& operator = (const MyApplicationCtx& other);

更好的是,还可以在类中定义一个私有(private)结构,如下所示:

struct AppInfo
{
    std::string name;
    std::string path;
    std::string desciption;
    struct loginInformation loginInfo;
    int appVersion;
    std::string appPresident;
};

在您的 App 类的复制构造函数和赋值运算符中,您可以利用 AppInfo 自动生成的赋值运算符为您完成所有赋值操作。这是假设您只希望在“克隆”时复制 MyApplicationCtx 成员的一个子集。

如果您添加或删除 AppInfo 结构的成员而无需更改所有样板文件,这也将自动正确。

关于c++ - C++ 中的编码实践,您的选择是什么,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1716485/

相关文章:

C++数组元素的构造顺序

python - 要在 python 中打印特定的文件夹名称?

coding-style - 除了AND/OR/NOT之外,编程中其他逻辑运算符有什么意义呢?

c++ - 使用 makefile 链接来自不同目录的 .h 文件和 .c 文件

c++ - LPPICTURE 在哪里定义的?

python - 为什么在 Python 中是 "easier to ask forgiveness than it is to get permission"?

oop - 分解大成员函数

php - 从可能不存在而没有错误的数组值分配 PHP 变量的最快方法

c++ - 裁剪图像的 OpenCV Mat 无法在 MFC View 上正确显示

c++ - 在 qsort C++ 中无效使用非静态成员函数