- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
C++新手在这里
因此,我检查了类在c++中的工作方式,并编写了以下代码:
class A{
...
}
class B: public A{
...
}
int main(void){
A array[10];
}
array[0] = new B();
不起作用
最佳答案
在Java中,类类型的变量始终是对对象的引用。即
A a = new A();
A a2 = a; // now a and a2 represent the same object
a.x = 12; // now print(a2.x) will also output 12
new A()
将在堆(可以动态分配的内存区域)上创建实际对象,并返回其内存地址。
a
和
a2
实际上(内部)仅包含该地址。
int a = 1;
int a2 = a;
a = 3;
// now a2 will still be 1
class A {
public:
int x;
};
A a;
A a2;
a.x = 1;
a2 = a; // actually calls a2.operator=(a) which is implicitly defined, and assigns all data members (here only int x) the values from the other A
a.x = 2;
std::cout << a2.x << std::end; // will output 1
A as[10]
,那么在堆栈上分配的一系列10 A对象也是如此。
class A {
public:
int x;
};
class B : public A {
public:
int y;
};
A a;
a.x = 1;
B b;
b.x = 2;
b.y = 500;
// and then:
a = b; // now a.x == 2, but a holds no information about the y value
// with arrays it is the same:
A as[2];
as[0] = b; // now as[0].x == 2, --
a = b
只会将其父类(super class)中
b
中的值复制到
a
中。
A a;
a.x = 1;
A& a_ref = a;
a_ref
是对
a
的引用
a_ref = a2
与
a = a2
具有相同的效果
a.x = 2
std::cout << a_ref.x << std::endl; // now outputs 2
a
存在,就必须存在
a_ref
,否则
a_ref
无效,对其进行访问将使程序崩溃。在Java中,对象是在堆上分配的,并且仅当不再存在指向它的引用时才释放对象(这称为垃圾回收)。
B b;
A& a_ref2 = b;
// now a_ref2 is a reference to b.
// (aka B has been downcasted)
// to access b.y from a_ref2, you could do:
int the_y = static_cast<B&>(a_ref2).y
a_ref2
指向
B
对象时才起作用。否则,它将填充段错误/崩溃。
A
是多态的(请参见下文),则可以改用
dynamic_cast<B&>(a_ref2)
(仍然不建议使用)。如果
a_ref2
不是
B
,它将检测到错误并引发异常。
class A {
public:
virtual int get_v() { return 1; }
int get() { return 1; }
int get_a() { return 3; }
};
class B : public A {
public:
int get_v() override { return 2; } // 'override' is not needed, and only works in C++11
int get() { return 2; }
};
B b;
A& a_ref = b;
b.get_v(); // returns 2
b.get(); // returns 2
b.get_a(); // returns 3, by inheritance
a_ref.get_v(); // returns 2, because get_v is a virtual function.
A::get_v
的类型为
B::get_v
,因此在编译时尚不清楚它将调用
a_ref
还是
A&
。相反,要调用的函数是在运行时决定的,具体取决于
a_ref
指向的对象。在Java中,所有功能都是这样。
a_ref.get(); // returns 1.
get()
不是多态的,因此它会调用
A
的
get()
函数,因为
a_ref
的类型为
A&
。
a_ref.get_a(); // returns 3, by inheritance
a_ref.x
和
b.x
)相同的方式访问引用。指针变量是地址。与引用不同,可以使它们在初始分配后指向另一个对象:
B b; // same classes A and B as before
A* a_ptr = &b; // a is now a pointer to b.
// The type A* means "pointer to B". &b means "address of b".
// Polymorphism works the same:
a_ptr->get_v(); // returns 2
a_ptr->get(); // returns 1.
a_ptr->get_a(); // returns 3.
A* a_ptr = new B(); // a_ptr is now a pointer to a B allocated on the heap
...
delete a_ptr; // must be done to deallocate the B, otherwise there will be a memory leak.
A*
(而不是
B*
),所以多态类的析构函数应该是虚的:
class A {
public:
...
virtual ~A() { .... }
};
class B : public A {
public:
...
~B() override { .... }
};
A::~A
。
A* array[10];
array[0] = new B();
array[0]->get_v();
delete array[0];
array[1]->get_v()
或
delete array[1]
将是错误。
array
将是指向
A
类型的对象的指针的数组,或者是
A
的子类。
A* array = new[10] A; // array is now a pointer to an array
array[0].x = 1;
delete[] array; // Deallocates as many items as where allocated
A as[10]
相同。这些将是
A
对象,而执行
array[0] = b
只会从
b.x
复制
b
。
std::unique_ptr
。它是指针的包装,因此两个
unique_ptr
都不能指向同一项目。 (因为禁止复制
unique_ptr
等):
#include <memory>
// needed for std::unique_ptr
std::unique_ptr<A> array[10];
array[0].reset( new B() ); // needed to assign a value to it
array[0]->get_v();
array
元素默认初始化为零。访问它们将引发异常,而不是段错误等。
=
分配项目(因为语义不同)。相反,
reset
分配指针。如果之前有另一个指针,则首先将它添加为
delete
。另外,不需要(或可能)没有
delete array[0]
,当变量
unique_ptr
超出范围时,
array
删除项目。
A array[10];
shared_ptr
可以复制初始化(即,构造函数采用单个值:)
class A {
public:
int x;
A(int nx) : x(nx) {}
};
std::array<A, 3> ar = { 1, 2, 3 };
// or
std::array<A, 2> ar2 = { a, a2 }; // makes copies
关于c++ - C++继承和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26455818/
我正在尝试创建一个包含 int[][] 项的数组 即 int version0Indexes[][4] = { {1,2,3,4}, {5,6,7,8} }; int version1Indexes[
我有一个整数数组: private int array[]; 如果我还有一个名为 add 的方法,那么以下有什么区别: public void add(int value) { array[va
当您尝试在 JavaScript 中将一个数组添加到另一个数组时,它会将其转换为一个字符串。通常,当以另一种语言执行此操作时,列表会合并。 JavaScript [1, 2] + [3, 4] = "
根据我正在阅读的教程,如果您想创建一个包含 5 列和 3 行的表格来表示这样的数据... 45 4 34 99 56 3 23 99 43 2 1 1 0 43 67 ...它说你可以使用下
我通常使用 python 编写脚本/程序,但最近开始使用 JavaScript 进行编程,并且在使用数组时遇到了一些问题。 在 python 中,当我创建一个数组并使用 for x in y 时,我得
我有一个这样的数组: temp = [ 'data1', ['data1_a','data1_b'], ['data2_a','data2_b','data2_c'] ]; // 我想使用 toStr
rent_property (table name) id fullName propertyName 1 A House Name1 2 B
这个问题在这里已经有了答案: 关闭13年前。 Possible Duplicate: In C arrays why is this true? a[5] == 5[a] array[index] 和
使用 Excel 2013。经过多年的寻找和适应,我的第一篇文章。 我正在尝试将当前 App 用户(即“John Smith”)与他的电子邮件地址“jsmith@work.com”进行匹配。 使用两个
当仅在一个边距上操作时,apply 似乎不会重新组装 3D 数组。考虑: arr 1),但对我来说仍然很奇怪,如果一个函数返回一个具有尺寸的对象,那么它们基本上会被忽略。 最佳答案 这是一个不太理
我有一个包含 GPS 坐标的 MySQL 数据库。这是我检索坐标的部分 PHP 代码; $sql = "SELECT lat, lon FROM gps_data"; $stmt=$db->query
我需要找到一种方法来执行这个操作,我有一个形状数组 [批量大小, 150, 1] 代表 batch_size 整数序列,每个序列有 150 个元素长,但在每个序列中都有很多添加的零,以使所有序列具有相
我必须通过 url 中的 json 获取文本。 层次结构如下: 对象>数组>对象>数组>对象。 我想用这段代码获取文本。但是我收到错误 :org.json.JSONException: No valu
enter code here- (void)viewDidLoad { NSMutableArray *imageViewArray= [[NSMutableArray alloc] init];
知道如何对二维字符串数组执行修剪操作,例如使用 Java 流 API 进行 3x3 并将其收集回相同维度的 3x3 数组? 重点是避免使用显式的 for 循环。 当前的解决方案只是简单地执行一个 fo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有来自 ASP.NET Web 服务的以下 XML 输出: 1710 1711 1712 1713
如果我有一个对象todo作为您状态的一部分,并且该对象包含数组列表,则列表内部有对象,在这些对象内部还有另一个数组listItems。如何更新数组 listItems 中 id 为“poi098”的对
我想将最大长度为 8 的 bool 数组打包成一个字节,通过网络发送它,然后将其解压回 bool 数组。已经在这里尝试了一些解决方案,但没有用。我正在使用单声道。 我制作了 BitArray,然后尝试
我们的数据库中有这个字段指示一周中的每一天的真/假标志,如下所示:'1111110' 我需要将此值转换为 boolean 数组。 为此,我编写了以下代码: char[] freqs = weekday
我是一名优秀的程序员,十分优秀!