C++ string的传入数据指针和size的构造函数
时间: 2024-10-05 14:02:46 浏览: 32
在C++中,`std::string` 类有一个特殊的构造函数,用于接收字符数组(即数据指针)和长度信息,表示一个字符串。该构造函数的基本形式如下:
```cpp
std::string str(const char* c_str, size_t n = nullptr);
```
这个构造函数接受两个参数:
1. `const char* c_str`: 指向一个常量字符数组,它是新创建的`std::string` 的内容来源。
2. `size_t n` (可选): 如果提供了一个值,它指定从`c_str`开始到第`n`个元素(不包括第`n+1`个)的有效字符数。如果省略了`n`,则默认会一直读取直到遇到空字符(`'\0'`)为止。
例如,如果你有一个包含ASCII编码的字符数组`char arr[] = "Hello"`,你可以像下面这样创建一个`std::string`:
```cpp
std::string myString(arr, sizeof(arr) - 1); // 注意去掉最后一个'\0'
```
这里减一是因为数组索引从0开始,而字符串结束在`\0`位置。
相关问题
构造函数传入父类指针的好处及具体示例?
构造函数传入父类指针的好处在于可以在子类对象的构造函数中调用父类构造函数,并且可以继承父类的成员变量和成员函数,方便代码的重用和维护。
具体示例如下:
```c++
class Animal {
public:
Animal(string name) : m_name(name) {}
virtual void speak() { cout << "I am an animal." << endl; }
protected:
string m_name;
};
class Dog : public Animal {
public:
Dog(string name, string breed) : Animal(name), m_breed(breed) {}
void speak() { cout << "I am a dog, my breed is " << m_breed << "." << endl; }
private:
string m_breed;
};
int main() {
Animal* animal = new Dog("Tom", "Labrador");
animal->speak();
delete animal;
return 0;
}
```
在上面的例子中,Animal 是父类,Dog 是子类,Dog 构造函数中传入了 Animal 对象的指针,以调用 Animal 的构造函数。这样,Dog 就可以继承 Animal 的成员变量和成员函数,同时也可以定义自己的成员变量和成员函数。在 main 函数中,我们创建了一个 Animal 对象的指针,并将其指向了一个 Dog 对象,调用 speak 函数时,实际上会调用 Dog 的 speak 函数,输出“我是一只狗,我的品种是 Labrador。”。这就是通过构造函数传入父类指针实现多态的一个例子。
利用c++程序编写在类内声明与定义构造函数,给数据成员(年龄age、学号num 性别sex、姓名name)赋默认值(例如:18,202311,m, zhangsan) - . 2.定义一个对象stu1与对象指针p1,通过指针p1调用display()函数,查看构造函数给的默认值是否正确; 3. 在类内再声明一个构造函数,在类外定义,实现函数重载(此处不赋默认值)
好的,我来回答你的问题。
1. 在类内声明与定义构造函数,给数据成员赋默认值的代码如下:
```cpp
class Student {
public:
Student() : age(18), num("202311"), sex('m'), name("zhangsan") {}
Student(int a, string n, char s, string nu) : age(a), name(n), sex(s), num(nu) {}
void display() {
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
cout << "Sex: " << sex << endl;
cout << "Number: " << num << endl;
}
private:
int age;
string num;
char sex;
string name;
};
```
2. 定义对象stu1和对象指针p1,并通过指针p1调用display()函数的代码如下:
```cpp
int main() {
Student stu1;
stu1.display();
Student* p1 = &stu1;
p1->display();
return 0;
}
```
这段代码会输出以下内容:
```
Name: zhangsan
Age: 18
Sex: m
Number: 202311
Name: zhangsan
Age: 18
Sex: m
Number: 202311
```
我们可以看到,对象stu1和对象指针p1调用display()函数输出的结果相同,说明对象指针p1调用函数的方式是正确的。
3. 在类内再声明一个构造函数,在类外定义,实现函数重载(此处不赋默认值)的代码如下:
```cpp
class Student {
public:
Student() : age(18), num("202311"), sex('m'), name("zhangsan") {}
Student(int a, string n, char s, string nu) : age(a), name(n), sex(s), num(nu) {}
Student(string n, string nu, char s, int a) : age(a), num(nu), sex(s), name(n) {}
void display() {
cout << "Name: " << name << endl;
cout << "Age: " << age << endl;
cout << "Sex: " << sex << endl;
cout << "Number: " << num << endl;
}
private:
int age;
string num;
char sex;
string name;
};
```
这段代码中,我们新增了一个构造函数,它的参数列表与之前的构造函数不同,实现了函数重载。在类外定义这个构造函数的代码如下:
```cpp
Student::Student(string n, string nu, char s, int a) : age(a), num(nu), sex(s), name(n) {}
```
这段代码实现了构造函数的定义,并赋予了它传入参数的值。
阅读全文