Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用C+中的构造函数将Int数组复制到Int指针+;_C++ - Fatal编程技术网

C++ 如何使用C+中的构造函数将Int数组复制到Int指针+;

C++ 如何使用C+中的构造函数将Int数组复制到Int指针+;,c++,C++,我正在尝试将int数组x插入int*v。这是我的密码。请为我提供最佳解决方案及其背后的原因 这行有一个错误。不是复制数组值,而是获取其垃圾值。线v1=x class vector { int *v; int size; public: vector(int m) { v = new int[size = m]; for (int i = 0; i < size; i++) v[i] = 0; }

我正在尝试将int数组x插入int*v。这是我的密码。请为我提供最佳解决方案及其背后的原因

这行有一个错误。不是复制数组值,而是获取其垃圾值。线v1=x

class vector
{
    int *v;
    int size;
public:
    vector(int m)
    {
        v = new int[size = m];
        for (int i = 0; i < size; i++)
            v[i] = 0;
    }
    vector(int *a)
    {

        for (int i = 0; i < size; i++)
            v[i] = a[i];
    }

    int operator *(vector &y)
    {
        int sum = 0;
        for (int i = 0; i < size; i++)
            sum += v[i] * y.v[i];
        return sum;
    }
    void disp()
    {
        for (int i = 0; i < size; i++)
            cout << v[i] << " ";
        cout << "\n";

    }
};
int main()
{
    clrscr();
    int x[3] = { 1,2,3 };
    int y[3] = { 4,5,6 };
    vector v1(3);
    //v1.disp();
    vector v2(3);
    v2.disp();
    v1 = x;
    v1.disp();
    //v2=y;
    v2.disp();
    int r = v1 * v2;
    cout << "R = " << r;
    getch();
    return 0;
}
类向量
{
int*v;
整数大小;
公众:
向量(int m)
{
v=新整数[size=m];
对于(int i=0;i难道你忘了在你的
vector
类中添加赋值操作符了吗

  vector & operator=(int *a)
  {
    for (int i = 0; i < size; i++)
      v[i] = a[i];

    return *this;
  }
vector&operator=(int*a)
{
对于(int i=0;i
您忘记在
向量
类中添加赋值运算符:

  vector & operator=(int *a)
  {
    for (int i = 0; i < size; i++)
      v[i] = a[i];

    return *this;
  }
vector&operator=(int*a)
{
对于(int i=0;i
在该行中

v1=x;
vector v1(3);
v1=x;
可能是这样,您希望它调用第二个构造函数,该构造函数将
int*
作为参数。但这不会发生

它可以看作是从基本类型到类类型的类型转换。我们希望在这里调用适当的构造函数。

但请记住,构造函数在创建对象后只调用一次

这里,排队

v1=x;
vector v1(3);
v1=x;
已调用第一个构造函数。然后

v1=x;
vector v1(3);
v1=x;
现在不会调用第二个构造函数

对于每个类,
=
操作符都是默认重载的。这就是为什么我们可以轻松地将对象分配给彼此的原因

因此,行
v1=x
调用默认重载赋值
=
运算符。 这里,它将数组x的地址,即
&x[0]
视为类对象的地址。因为它不是
向量类
对象的地址

=>它会导致分段错误

你的答案

要将
int
数组分配给
int指针
,即分配给
向量类
的成员变量
int*v

  • 重载类内的赋值运算符
    =
  • 将类对象初始化为第一行中的数组本身。即
  • vector v1=x;//修改类构造函数,使其大小为常量。
    

    在该行中

    v1=x;
    
    vector v1(3);
    
    v1=x;
    
    可能是这样,您希望它调用第二个构造函数,该构造函数将
    int*
    作为参数。但这不会发生

    它可以看作是从基本类型到类类型的类型转换。我们希望在这里调用适当的构造函数。

    但请记住,构造函数在创建对象后只调用一次

    这里,排队

    v1=x;
    
    vector v1(3);
    
    v1=x;
    
    已调用第一个构造函数。然后

    v1=x;
    
    vector v1(3);
    
    v1=x;
    
    现在不会调用第二个构造函数

    对于每个类,
    =
    操作符都是默认重载的。这就是为什么我们可以轻松地将对象分配给彼此的原因

    因此,行
    v1=x
    调用默认重载赋值
    =
    运算符。 这里,它将数组x的地址,即
    &x[0]
    视为类对象的地址。因为它不是
    向量类
    对象的地址

    =>它会导致分段错误

    你的答案

    要将
    int
    数组分配给
    int指针
    ,即分配给
    向量类
    的成员变量
    int*v

  • 重载类内的赋值运算符
    =
  • 将类对象初始化为第一行中的数组本身。即
  • vector v1=x;//修改类构造函数,使其大小为常量。
    

    通过指针传递数组是一种容易出错的做法。您有两个构造函数:
    vector(int)
    vector(int*)
    。只有第一个构造函数初始化
    size
    v
    。构造函数
    vector(int*)
    不会初始化
    size
    v
    ,因此会产生未定义的行为。如果不释放分配给通过指针传递新数组的内存,则会出现内存泄漏。您有两个构造函数:
    vector(int)
    vector(int*)
    。只有第一个函数初始化
    size
    v
    。构造函数
    向量(int*)
    不会初始化
    size
    v
    ,因此会产生未定义的行为。如果不释放分配给新数组的内存,则会出现内存泄漏。数组是复合类型,而不是基本类型。最好坚持使用标准术语,而不是使用internet上一些快速“教程”编写的术语。“对于每个类,=运算符默认重载”错误那么,在=未重载的类中,如何可能将类对象分配给另一个类?当存在
    运算符=
    时,您可以进行分配。说始终存在一个运算符是不正确的。这就是我所说的“默认重载”一词的意思例外情况总是存在的。数组是复合类型,而不是基本类型。最好使用标准术语,而不是由internet上的一些快速“教程”编写的术语。“对于每个类,=运算符默认重载”那么,在一个=没有重载的类中,如何将类对象分配给另一个类呢?当存在
    操作符=
    时,您可以进行分配。说总是存在一个操作符是不正确的。这就是我所说的术语“Defaul”的意思