我的练习代码中的C ++代码错误

时间:2015-03-05 10:04:34

标签: c++

你可以帮我解决这个问题吗?

#include <iostream>
#include <cstring>

using namespace std;

class A
{
public:
    char str[4];

    A()
    {
        str = "C++";
        cout << "Constructor A" << endl;
    }

    void display()
    {
        cout << str << " is your name" << endl;
    }
};

int main()
{
    A a;
    a.display();
    return 0;
}

它会出现以下错误:

**************************Error********** 
StringProg.cpp:9: error: ISO C++ forbids initialization of member "str" 
StringProg.cpp:9: error: making "str" static StringProg.cpp:9: error: invalid in-class initialization of static data member of non-integral type "char [4]"
StringProg.cpp: In member function "void A::display()":
StringProg.cpp:17: error: "str" was not declared in this scope
**************************

2 个答案:

答案 0 :(得分:7)

C阵列存在很多问题,阻碍您做您想做的事情。

  • 字符串文字的类型为const char[n]n\0字符的长度+ 1)。要在C标准库函数中使用它们,它们会衰减到const char*,它不具有字符串的大小,并且为了找到它,需要遍历字符串(每个字符都被查看和比较到\0

  • 因此,数组赋值运算符需要相当重要;这不是由语言提供的,您必须使用像strcpy这样的库函数将文字移动到可用的内存中。换句话说,您不能像其他值一样分配C数组。

  • 数组以非常原始的方式运行;他们没有比较运算符,很难将它们传递给函数并正确存储在类中。

所以,因为以上所有......

首选std::stringchar[]

class A {
    std::string str;

public:
    // prefer constructor init list
    A() : str("C++") {
        // your line would work, too
        std::cout << "Constructor A" << std::endl;
    }

    void display() const {
        std::cout << str << " is your name" << std::endl;
    }
};

int main()
{
    A a;
    a.display();
    // return 0; is unnecessary
}

一些“经验法则”(拇指规则?):如果您需要多个元素,请从vector<>开始。永远不要使用C数组。 string一个元素,而不是“字符数组”。

答案 1 :(得分:-1)

尝试以下

#include<iostream>
#include<cstring>

class A
{
private:
    char str[4];

public:
    A() : str { "C++" }
    {
        std::cout << "Constructor A" << std::endl;
    }

    void display() const
    {
        std::cout << str << " is your name" << std::endl;
    }
};

int main()
{
    A a;

    a.display();

    return 0;
}

程序输出

Constructor A
C++ is your name

考虑到数组没有复制赋值运算符。因此,您的程序中的此声明

str = "C++';

即使更新拼写错误并写入

str = "C++";

无效。

您可以使用标头strcpy中声明的标准C函数<cstring>。例如

    #include <cstring>

    //...

    A()
    {
        std::strcpy( str, "C++" );
        std::cout << "Constructor A" << std::endl;
    }