gpt4 book ai didi

C++ 构造函数参数

转载 作者:搜寻专家 更新时间:2023-10-31 01:07:53 24 4
gpt4 key购买 nike

Bozo(const char * fname, const char * lname); // constructor prototype

在这种情况下,您将使用它来初始化新对象,如下所示:

Bozo bozetta = Bozo("Bozetta", "Biggens"); // primary form
Bozo fufu("Fufu", "O’Dweeb"); // short form
Bozo *pc = new Bozo("Popo", "Le Peu"); // dynamic object

关于这个我只是有几个问题。首先是,为什么在 char 之前需要 const?或者为什么它在那里?另外,为什么它声明为指针?

其次,“主要形式”和“简短形式”有区别吗?

第三个问题是,在Java中,我使用字符串变量作为形式参数,但在C++中它是在char中?我认为 char 只能包含一个字母表,而不是 char 数组。我可以用字符串代替吗?

最佳答案

First is that, why is const needed before char? or why is it there?. Also, why is it declaring as a pointer?

我先回答你的最后一个问题。这被声明为一个指针,因此构造函数可以接受一个字符数组。 const 表示指向的字符未在此 bozo 构造函数中修改。这很重要,因为您的示例用法可以传入 C 风格的字符串文字,这些文字通常位于程序的只读内存部分。任何修改此类字符串文字的尝试都是未定义的行为。

Second, is there any difference between the "primary form" and the "short form?"

第一种形式是在右侧创建一个临时 Bozo 对象,该对象用于初始化左侧的 bozetta。现在您可能认为此表单会产生额外的拷贝,但事实并非如此。 C++ 标准的措辞方式允许编译器通过省略 在构造过程中跳过这个不必要的额外拷贝。因此在实践中,您会发现在所有尝试此操作的现代 C++ 编译器上,bozetta 将使用您在上面显示的原型(prototype)构建——不会发生额外的复制。

第二种形式使用可以接受两个字符串文字作为参数的 Bozo 构造函数显式构造一个 Bozo 对象。

假设未将构造函数声明为 explicit,这两种形式具有相同的行为。

I thought char can only contain a single alphabet, and it's not a char array.

没错,一个char 只能保存一个字节的信息。 C 和 C++ 没有实际的 native 字符串类型,这与您在其他语言中喜欢的类型不同。所以一个“字符串”实际上只是一堆 chars 放置在一个偶然的内存块中。上面的 Bozo 构造函数可以通过将指向该 block 开始位置的指针作为输入来处理该 block 。

Could I do this with string instead?

是的,你可以,这实际上是你应该通过使用 std::string 来实现的首选方式。构造函数声明如下所示:

Bozo(std::string fname, std::string lname);
// or to avoid potential copying of long strings
Bozo(const std::string &fname, const std::string &lname);

关于C++ 构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18754962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com