2
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 数组。我可以用字符串来代替吗?

4

2 回答 2

2

是的 Aaron 1 回答:在 char 之前需要 const ,因为在这里我们不希望字符串的值被错误地更改。Const 将保持原始值,因为我们传递给构造函数指针(通过 ref )。1 Ans: Bozo bozetta = bozo(“Bozetta”, “Biggens”); // 初级形式 Delcare Bozo bozetta = bozo ( "Bozetta", "Biggens" ) ; 是的,short 和 primary 之间有很多区别,我们声明一个 Bozo 类型的对象并为其分配新的对象值。3 Ans:是的,你是正确的,char 一次只包含 1 个字符,但在这里你声明了 char * ( char pointer ),它是 char 数组的意思。Char 指针在 C++ 中被认为是字符串。

于 2013-09-12T04:01:01.253 回答
2

首先是,为什么在 char 之前需要 const?或者它为什么在那里?另外,为什么它声明为指针?

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

第二,“初级形式”和“短形式”有什么区别吗?

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

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

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

我认为 char 只能包含一个字母,它不是 char 数组。

没错,achar只能保存一个字节的信息。C 和 C++ 没有实际的本机字符串类型,与您在其他语言中习惯使用的类型不同。因此,“字符串”实际上只是chars在一个偶然的内存块中布置的一堆。上面的Bozo构造函数可以通过将指向该块开始位置的指针作为输入来处理该块。

我可以用字符串来代替吗?

是的,您可以,这实际上是您应该使用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);
于 2013-09-12T07:28:16.133 回答