C++ 如何使用C+中的构造函数将Int数组复制到Int指针+;
我正在尝试将int数组x插入int*v。这是我的密码。请为我提供最佳解决方案及其背后的原因 这行有一个错误。不是复制数组值,而是获取其垃圾值。线v1=xC++ 如何使用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; }
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”的意思