不同的构造方式

时间:2017-07-05 10:18:19

标签: c++ class

我写了一些小课,现在我看到了调用构造函数的不同方法。哪种方式正确? (或者更好的方式)

  

SharedKeys.h

#ifndef SHAREDKEYS_H
    #define SHAREDKEYS_H

    class SharedKeys
    {
    private:
        char keyCode;

    public:
        SharedKeys(char keycode)
        {
            keyCode = keycode;
        }
        ~SharedKeys() {}

        char getKeyCode() { return keyCode; };

    };

    #endif
  

Main.cpp的

我的构造函数调用方式:

SharedKeys* SK;
SK = new SharedKeys(*cstr); //Call contructor

其他构造函数调用方式:

// SharedKeys constructor
SharedKeys::SharedKeys(*cstr)
{
    keyCode = keycode;
}

我愿意接受任何改进建议。谢谢。

  

Main.cpp的

SK必须是这里的指针还是? (此代码有效)

SharedKeys* SK;

    vector<SharedKeys> StoreSharedKeys;

string str = x;
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());

SK = new SharedKeys(*cstr);
StoreSharedKeys.push_back(*SK);
delete[] cstr;

我理解正确吗?

cout << "Key: " <<  x << " loaded." << endl;
string str = x;
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());

SharedKeys SK(*cstr);
StoreSharedKeys.push_back(SK);
delete[] cstr;

如果我看到正确的话,那么这个构造函数调用是正确的方法。所以我不必删除对象。正确的吗?

3 个答案:

答案 0 :(得分:1)

第二个“通话”根本不是通话。

这是一种课外定义。类的方法(包括构造函数和析构函数)可以在类的主体内部或外部定义。如果方法是在类之外定义的,那么只能在类中声明它们。

使用类外定义的一个重要原因是,您可以将类定义放在头文件中,将方法定义放在.cpp文件中。

答案 1 :(得分:1)

创建对象有两种方法:

SharedKeys   sk( 'a');
SharedKeys*  sk_ptr = new SharedKeys( 'a');

第一行在堆栈上创建一个对象,当它超出范围时将被删除(例如,函数结束)。

第二行动态创建一个对象,一旦保留范围,该对象将不会被删除。您必须使用delete手动删除它。或者,更好的是,使用智能指针。

您选择创建对象的方式取决于用例,对象的大小(应始终动态分配大对象),对象的生命周期等。但两种方法最终都会调用相同的构造函数。 / p>

答案 2 :(得分:0)

问题可能在于形式 你可以编写没有动态分配内存的构造函数

SharedKeys SK(*cstr);

或与:

SK = new SharedKeys(*cstr);

我看到的第二件事......你看到了例子

#include <iostream>
void function(char a, int lenght)
{
    std::cout << a << std::endl;
//  for (int i = 0; i < lenght; i++) printf("%c ", a[i]);
}
void function2(char *a, int lenght)
{
    for (int i = 0; i < lenght; i++) printf("%c ", a[i]);
}
int main()
{
    char tab[2]{ 'a','b' };
//  function(tab,2);
    function(*tab,2);
//  function2(tab,2);
//  function2(*tab,2);
    return 0;
}

你的行

SK = new SharedKeys(*cstr);

这一行只给出构造函数的第一个元素数组,我认为它不像你想要的那样。如果你想要给出数组char,你应该使用来自function2的formule(来自示例)。

编辑: 是的,你必须删除对象,

 delete[] cstr

delete SK