C ++构造函数参数

时间:2013-09-12 03:43:49

标签: c++

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

2 个答案:

答案 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);