Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C字符串在C++;?_C++_Oop_Constructor_C Strings - Fatal编程技术网

C++ C字符串在C++;?

C++ C字符串在C++;?,c++,oop,constructor,c-strings,C++,Oop,Constructor,C Strings,我有一个类BankAccount,有两个字符串成员-name和num。我想要的是在创建这些对象时(调用构造函数时)为它们赋值。然而,当我试图创建一个对象时,编译器说没有构造函数的实例与参数列表匹配。 我想问为什么会这样 // hwk-2.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include "pch.h" #include <iostream&g

我有一个类
BankAccount
,有两个字符串成员-
name
num
。我想要的是在创建这些对象时(调用构造函数时)为它们赋值。然而,当我试图创建一个对象时,编译器说没有构造函数的实例与参数列表匹配。 我想问为什么会这样

// hwk-2.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include "pch.h"
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
class BankAccout {
    char name[23];
    char num[15];
    double sum;
public:
    BankAccout(char *nm, char *nr, double s) {
        strcpy(name,nm);
        strcpy(num, nr);
        sum = s;
    }


};
int main()
{
    BankAccout k("Peter", "0403940940", 34.21);

}
//hwk-2.cpp:此文件包含“main”函数。程序执行从那里开始并结束。
//
#包括“pch.h”
#包括
#包括
#包括
使用名称空间std;
银行账户类{
字符名[23];
字符数[15];
双和;
公众:
银行账户(字符*nm,字符*nr,双s){
strcpy(名称,nm);
strcpy(个数,个数);
总和=s;
}
};
int main()
{
银行账户k(“彼得”,“040394040”,34.21);
}

构造函数的签名不匹配。 这一个将匹配:

BankAccount(const char *nm, const char *nr, double s);
编辑:

原因是您在主函数中调用构造函数的方式。您正在将文字字符串作为参数。这些文字是常量,您无法在运行时更改它们。因此,您将向
const char*
传递指针

如果你看这个相反的例子,这是非常明显的。这是一种与旧签名
bankaccount(char*nm,char*nr,double s)兼容的方式

intmain(intargc,char*argv[])
{
字符名[]=“你好”;
字符编号[]=“1234”;

std::cout作为咖啡休息时间的练习,这里有更为惯用的版本

#include "pch.h"
#include <iostream>
#include <string>

class BankAccount {
    std::string name_;
    std::string num_;
    double sum_;
public:
    BankAccount(std::string name, std::string num, double sum) {
        name_ = name;
        num_ = num;
        sum_ = sum;
    }
};

int main()
{
    BankAccount k("Peter", "0403940940", 34.21);
}
#包括“pch.h”
#包括
#包括
类别银行帐户{
std::字符串名称;
std::string num;
双和;
公众:
银行账户(标准::字符串名称,标准::字符串编号,双和){
姓名=姓名;
num=num;
sum=sum;
}
};
int main()
{
银行账户k(“彼得”,“0403940940”,34.21);
}

如果您不需要在类中具有其他功能,则更简单的版本是:只需使用结构

#include <string>

struct BankAccount {
  std::string name;
  std::string number;
  double balance;
};

int main() {
  BankAccount account{"Joy", "44", 43.};
}
#包括
结构银行账户{
std::字符串名;
std::字符串编号;
双平衡;
};
int main(){
银行账户{“Joy”,“44”,43.};
}

在构造函数参数中使用
const char*
而不是
char*
。字符串文字是
const char[]
值,它们衰减为
const char*
,而不是
char*
。不过,您确实应该使用
std::String
而不是
char[]开始数组。这是C++,不是C,以后为什么<代码> GETNAME()
返回一个
std::string
但是你没有在其他任何地方使用它?无论你在哪里有一个c-string,你都应该使用
std::string
。而且不要使用
名称空间std
为什么人们会被否决?这是一个很好的问题。它清楚地说明了问题所在,它包括了复制所需的完整源代码。I希望所有rep==1的问题都是这样的人们仍然对它投反对票!但无论如何不要这样做,在任何地方都使用std::string如果你能解释为什么需要进行此更改,这将对OP和未来的读者有所帮助。使用构造函数初始化列表并将字符串构造函数参数移动到数据列表中会更加习惯我同意这个解决方案很好。但它并没有回答OP的问题:为什么编译器找不到与实际参数匹配的构造函数。我认为这对于初学者来说是一个非常有趣的问题。但无论如何,从你的惯用版本中也有很多东西需要学习,这也是正确的。
#include <string>

struct BankAccount {
  std::string name;
  std::string number;
  double balance;
};

int main() {
  BankAccount account{"Joy", "44", 43.};
}