在 C++ 中使用 char* 进行初始化

delcaring an object and initializing using a char* in c++

本文关键字:初始化 char C++      更新时间:2023-10-16

我是 c++ 初学者,编译以下代码时遇到问题问题出在语句T a = s其中s是包含abcdechar*

这里的目标是声明一个 T 的对象并使用 s 初始化它。

我在这条线上也有麻烦for(int i = 0; i < a(); i++).

我不知道如何使用构造函数或名为 a() 的函数来返回大小。

这是我的代码:

#include <iostream>
#include <cassert>
using namespace std;
class T{
    int nb ;
    char *pc;
public:
    T(int);
    ~T();
    T(T&);
    char& operator[](int);
    T(const char* s){
        int n ;
        for(int i = 0 ; s[i] != '' ;i++ ) n++ ;
        nb = n ;
        pc= new char[nb];
        for(int i=0 ; i < nb ; i++) pc[i] = s[i];
    }

};

    T::T(int k){
        assert(k > 0);
        nb = k;
        pc = new char[nb];
    }
    T ::~T(){
        if( pc != NULL) delete [] pc;
    }
    T::T(T& t){
        nb=t.nb;
        delete[] pc;
        pc = new char[nb];
        for(int i=0 ; i < nb ; i++) pc[i] = t.pc[i];
    }
    char& T::operator[](int index){
        assert(index >=0 && index <= nb);
        return pc[index];
    }

int main(){
    char* s = "abcde";
    T a = s;
    for(int i = 0; i < a(); i++)
        cout << a[i] << " ";
    cout << endl;
    T b = a;
    b[1] = '*';
    b[3] = '*';
    for(int i = 0; i < b(); i++)
    cout << b[i] << " ";
    cout << endl;
    return 0;
}

我收到以下错误:

从类型"T"的右值初始化类型"T&"的非常量引用无效|

您在定义对象时误解了"赋值"。

像定义对象一样定义对象时

T a = s;

它不是一个赋值,它是一个对象构造,你需要一个构造函数来接受一个const char*参数。

另一方面,如果你这样做

T a;
a = s;

然后这是一个作业。当然,这取决于T具有默认构造函数(不接受任何参数的构造函数(。


您现在得到的错误是因为您需要一个通过常量引用获取其参数的复制构造函数。定义

T a = s;

实际上等于

T a = T(s);

T(s)创建一个临时对象,一旦 a 的完全初始化完成,该对象将被销毁。并且非常量引用不能绑定到临时对象,因此您的复制构造函数需要接受const T&参数。

初始化

不使用运算符=。它改用构造函数,尽管 = 符号语法。所以你需要有带有签名 T::T(char*( 的构造函数。顺便说一下,我强烈建议将其设为 const char*,以避免编译器对你大喊大叫,因为它分配了字符串文字。