默认构造函数(C+;+;)中的用户输入。这能做到吗? 这是一个问题:用C++编写一个程序,分别输入两个序列,并用构造函数求出两个序列的总长度。 这是我写的程序。它运行,但我是否正确使用了构造函数?我们可以这样做吗?我们可以在默认构造函数中接受用户输入吗 #include <iostream> #include <string.h> using namespace std; class merge { private: int i; char seq1[5]; int len, len1, len2; char seq2[5]; public: merge(); }; merge::merge() { cout << "Enter first sequence: "; cin >> seq1; cout << "Enter second sequence: "; cin >> seq2; len1 = strlen(seq1); cout << "Length of first sequence: " << len1 << "\n"; len2 = strlen(seq2); cout << "Length of first sequence: " << len2 << "\n"; strcat (seq1, seq2); cout << "Merged sequence: " << seq1 << "\n"; len = strlen(seq1); cout << "Total length: " << len; } int main() { merge o; } #包括 #包括 使用名称空间std; 类合并{ 私人: int i; 字符序列1[5]; int len,len1,len2; 字符序列2[5]; 公众: 合并(); }; merge::merge(){ cout>seq1; cout>seq2; len1=strlen(seq1); 库特

默认构造函数(C+;+;)中的用户输入。这能做到吗? 这是一个问题:用C++编写一个程序,分别输入两个序列,并用构造函数求出两个序列的总长度。 这是我写的程序。它运行,但我是否正确使用了构造函数?我们可以这样做吗?我们可以在默认构造函数中接受用户输入吗 #include <iostream> #include <string.h> using namespace std; class merge { private: int i; char seq1[5]; int len, len1, len2; char seq2[5]; public: merge(); }; merge::merge() { cout << "Enter first sequence: "; cin >> seq1; cout << "Enter second sequence: "; cin >> seq2; len1 = strlen(seq1); cout << "Length of first sequence: " << len1 << "\n"; len2 = strlen(seq2); cout << "Length of first sequence: " << len2 << "\n"; strcat (seq1, seq2); cout << "Merged sequence: " << seq1 << "\n"; len = strlen(seq1); cout << "Total length: " << len; } int main() { merge o; } #包括 #包括 使用名称空间std; 类合并{ 私人: int i; 字符序列1[5]; int len,len1,len2; 字符序列2[5]; 公众: 合并(); }; merge::merge(){ cout>seq1; cout>seq2; len1=strlen(seq1); 库特,c++,C++,默认构造函数(C++)中的用户输入。可以这样做吗 从技术上讲是的。构造函数主体与任何其他函数基本相同,并且可以进行I/O 实际上,构造函数中的I/O将是一个糟糕的设计 所以我们可以,但我们不这样做 我们可以在默认构造函数中接受用户输入吗 #include <iostream> #include <string.h> using namespace std; class merge { private: int i; char seq1[5];

默认构造函数(C++)中的用户输入。可以这样做吗

从技术上讲是的。构造函数主体与任何其他函数基本相同,并且可以进行I/O

实际上,构造函数中的I/O将是一个糟糕的设计

所以我们可以,但我们不这样做

我们可以在默认构造函数中接受用户输入吗

#include <iostream>
#include <string.h>
using namespace std;
class merge {
    private:
    int i;
    char seq1[5];
    int len, len1, len2;
    char seq2[5];
    public:
    merge();
};
merge::merge() {
    cout << "Enter first sequence: ";
    cin >> seq1;
    cout << "Enter second sequence: ";
    cin >> seq2;
    len1 = strlen(seq1);
    cout << "Length of first sequence: " << len1 << "\n";
    len2 = strlen(seq2);
    cout << "Length of first sequence: " << len2 << "\n";
    strcat (seq1, seq2);
    cout << "Merged sequence: " << seq1 << "\n";
    len = strlen(seq1);
    cout << "Total length: " << len;
}
int main() {
    merge o;
}
是的,你能做到,但你不应该

有很多方法来解释为什么。例如,考虑默认的可构造的含义。 指定可以默认构造该类型的实例

要求

类型T满足DefaultConstructible如果

给定

下列表达式必须有效并指定了它们的 影响

  • tu
    对象u默认初始化
  • tu{}
    对象u值初始化或聚合初始化
  • T()
    /
    T{}
    类型为T的临时对象是值初始化或聚合初始化的
您的
merge
是可默认构造的。但它真的是吗


考虑添加第二个构造函数时会发生什么:

merge::merge(std::string seq1, std::string seq2);
现在我可以选择是使用默认构造函数从用户获取输入,还是从其他地方获取序列并调用另一个构造函数。听起来不错,不是吗

(事实并非如此。它只是帮助我在下面的示例中强调默认构造函数的问题。请耐心等待。)

使用默认可构造类型T可以,但与您的merge不太合适的代码是

示例std::vector

   using T = merge;

   std::vector<T> v(10);
   v[0] = T("1,2,3,4","4,5,6,7,8");
   // ...
我想向映射中添加一个元素(如果它以前不存在)。
std::map::operator[]
尝试查找具有给定键(
1
)的元素。它找不到该元素,因此它会插入一个具有该键的新元素和一个默认构造的
T
。然后返回对该
T
的引用。 我本可以使用
insert
,但我很懒,使用了
[]
。因此,此代码要求用户输入,但这不是我想要的


下面是我试图在上面解释的两个问题的演示:



从形式上讲,您的
合并
是默认可构造的,但在大多数实际情况下,它不是。默认构造函数应在默认状态下构造对象。读取用户输入令人惊讶,许多类型和算法要求您的类型是默认可构造的,即使您提供了默认构造函数。

您能否提供有关序列显示方式的信息?逗号分隔(
1,2,3
)、空格分隔(
1,2,3
)、范围(
1-3
)?等。这是可以做到的,但我不建议这样做。它不必要地将您的类与
std::cout
std::cin
功能相耦合,并降低了在不同程序中重用它的灵活性。战术说明:构造函数通常不适合进行用户输入或除初始化以外的任何操作。例如创建一个
merge
s数组并观看有趣的游戏。在这种情况下,您似乎只需要一个普通的旧函数,而不是一个类。@Johnny Mopp-我们可以输入类似(aatta)的序列@Srishti如果这是一个示例输入,您会遇到一个问题:数组大小为
5
,输入字符串长度为
5
。这不会为尾部
\0
留出空间。是否有理由不使用
std::string
?Ohhhh。所以我们可以这样做,但这不是构造函数的目的?
std::map<int,T> m;
m[1] = T("1,2,3,4","4,5,6,7,8");