不同的构造函数方式

The different constructor ways

本文关键字:方式 构造函数      更新时间:2023-10-16

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

共享密钥.h

#ifndef SHAREDKEYS_H
#define SHAREDKEYS_H
class SharedKeys
{
private:
char keyCode;
public:
SharedKeys(char keycode)
{
keyCode = keycode;
}
~SharedKeys() {}
char getKeyCode() { return keyCode; };
};
#endif

主.cpp

我的构造函数调用方式:

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

其他构造函数调用方式:

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

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

主.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;

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

第二个"调用"根本不是调用。

这是一个类外的定义。类的方法(包括构造函数和析构函数)可以在类的主体内部或外部定义。如果方法在类外部定义,则仅在类内声明它们。

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

有两种方法可以创建对象:

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

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

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

选择哪种方式创建对象取决于用例、对象的大小(应始终动态分配大型对象)、对象的生存期等。但这两种方法最终都调用了相同的构造函数。

问题可能出在形式上 可以在没有动态分配内存的情况下编写构造函数

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);

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

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

delete[] cstr

delete SK