首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同的构造方法

不同的构造方法
EN

Stack Overflow用户
提问于 2017-07-05 10:18:19
回答 3查看 109关注 0票数 0

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

SharedKeys.h

代码语言:javascript
复制
#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

我的构造函数调用方式:

代码语言:javascript
复制
SharedKeys* SK;
SK = new SharedKeys(*cstr); //Call contructor

其他构造函数调用方式:

代码语言:javascript
复制
// SharedKeys constructor
SharedKeys::SharedKeys(*cstr)
{
    keyCode = keycode;
}

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

Main.cpp

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

代码语言:javascript
复制
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;

我没听错你的话吗?

代码语言:javascript
复制
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;

如果我认为这是正确的,那么这个构造调用是正确的。所以我不需要删除这些对象。对,是这样?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-05 10:27:37

第二个“电话”根本不是一个电话。

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

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

票数 1
EN

Stack Overflow用户

发布于 2017-07-05 10:31:57

创建对象的方法有两种:

代码语言:javascript
复制
SharedKeys   sk( 'a');
SharedKeys*  sk_ptr = new SharedKeys( 'a');

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2017-07-05 10:51:25

问题可能是形式上的,您可以编写构造函数而不需要动态分配内存。

代码语言:javascript
复制
SharedKeys SK(*cstr);

或与:

代码语言:javascript
复制
SK = new SharedKeys(*cstr);

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

代码语言:javascript
复制
#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;
}

你的线路

代码语言:javascript
复制
SK = new SharedKeys(*cstr);

这一行只给构造函数提供第一个元素数组,我认为这不是您想要的。如果您想要给数组字符,您应该使用来自function2的格式(例如)。

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

代码语言:javascript
复制
 delete[] cstr

代码语言:javascript
复制
delete SK
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44923410

复制
相关文章

相似问题

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