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数组。我可以用字符串代替吗?
答案 0 :(得分:2)
是亚伦 1 Ans:在char之前需要const因为这里我们不希望错误地改变字符串的值.Const将保持原始值,因为我们传递给构造函数Pointer(通过ref)。 1 Ans:Bozo bozetta = bozo(“Bozetta”,“Biggens”); //主要形式 Delcare Bozo bozetta = bozo(“Bozetta”,“Biggens”); Ya和short之间有很多区别,我们声明了Bozo类型的对象并为其指定了新的对象值。 3 Ans:是的,你是正确的,char一次只包含1个字符,但在这里你声明了char *(字符指针),它是卑鄙的char数组。 Char指针在C ++中被认为是String。
答案 1 :(得分:2)
首先,为什么在char之前需要const?或者它为什么存在?另外,为什么声明为指针?
我首先回答你的上一个问题。这被声明为指针,因此构造函数可以接受一个字符数组。 const
表示未在此bozo
构造函数中修改指向的字符。这很重要,因为您的示例用法可以传递C样式的字符串文字,这些文字通常位于程序的只读内存部分。任何修改此类字符串文字的尝试都是未定义的行为。
第二,“主要形式”和“简短形式”之间是否存在差异?
第一种形式是在右侧创建一个临时Bozo
对象,该对象用于初始化左侧的bozetta
。现在您可能认为此表单会发生额外的副本,但事实并非如此。 C ++标准的措辞是这样的,它允许编译器在构造期间通过 eliding 跳过这个不必要的额外副本。所以在实践中,您会发现在所有现代C ++编译器中,您都可以使用上面显示的原型构建bozetta
- 不会发生额外的复制。
第二种形式使用Bozo
构造函数显式构造Bozo
对象,该构造函数可以接受两个字符串文字作为参数。
假设构造函数未声明explicit
。
我认为char只能包含一个字母,而且它不是char数组。
这是正确的,char
只能容纳一个字节的信息。 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);