-
浅拷贝的原理就是将值直接拷贝过去,有指针的时候使用浅拷贝就会造成一些问题。 class Array { public: Array(); Array(const Array &arr); ~Array(); void setCount(int count); int getCount(); private: int m_iCount; }查看全部
-
深拷贝:当有指针的时候进行拷贝会使指针指向同一块内存,arr1修改值会使内存中的值发生改变,arr2修改值也会使内存中的值发生改变,致使arr1和arr2的值相同。释放内存时去释放指针也将会出现问题,计算机会崩溃。 我们要的是拷贝值,而不是使指针指向相同的内存。 当进行对象拷贝时不是简单的进行值的拷贝,而是将堆中内存的数据也进行拷贝,这种拷贝模式即为深拷贝。 拷贝构造函数是为了对象之间初始化赋值的,浅拷贝将新对象再一次指向了旧对象分配的内存单元,释放时容易崩溃。而深拷贝采用新的内存申请和循环赋值可以避免重复使用一个块内存。查看全部
-
Coordinate类没有定义默认构造函数,且因为已经定义了一个构造函数,故编译器也不会为你自动生成一个默认构造函数。可是在main函数中,定义了一个Coordinate数组,这会对每一个元素进行初始化,如果不在定义的时候按照自己写的构造函数初始化,由于没有默认构造函数,所以没有匹配的调用,编译失败。查看全部
-
实例化对象A时,如果对象A有对象成员B,那么先执行对象B的构造函数,再执行A的构造函数。 如果对象A中有对象成员B,那么销毁对象A时,先执行对象A的析构函数,再执行B的析构函数。 如果对象A中有对象成员B,对象B没有默认构造函数,那么对象A必须在初始化列表中初始化对象B查看全部
-
如果坐标类有一个默认构造函数,那么在实例化线段对象的时候,不使用初始化列表。 如果坐标类要求必须有参数传入,那么在实例化线段类的时候,必须用初始化列表讲相应的值传递给坐标类 实例化Line时,要先实例化m_coorA和m_coorB,但是这两个对象没有默认构造函数,所以要用初始化列表。(初始化列表执行 在构造函数之前!!!) 如果Coordimate类有默认构造函数,也就是不带参数的构造函数,那么Line类就可以不使用初始化列表。如果只有带参数的构造函数,那么必须用初始化列表查看全部
-
在类定义时,加入这三句,防止防止头文件被重复包含造成类被重复定义 class定义前加 ifndef _ONCE_ #define _ONCE_ class定义的分号后加 #endif查看全部
-
1.一个对象作为另一个对象的数据成员,称为“对象成员” 2.对象成员的创建次序: 先创建成员对象,再创建包含着成员对象的对象。 3.对象成员的销毁次序: 先销毁包含了成员对象的对象,再销毁成员对象。 当没有自己定义的时候,系统都会自动生成。但是系统生成的构造函数和析构函数是空函数,没有实际作用。定义构造函数可以发给类成员设置默认值等等,同样的,如果我们的类数据成员包含了从堆中申请的内存,类的析构函数就应当加入包含释放堆中内存的语句。或者我们需要程序在对象解散时在屏幕上输出提示信息,也可以在类的析构函数中加入提示信息。查看全部
-
实例化对象数组时,每一个对象的构造函数都会被执行。 实例化对象数组时,内存既可以从堆上分配,也可以从栈上分配。 销毁对象数组时,每一个对象的析构函数都会被执行。 堆中实例化的数组需要手动销毁释放内存,在栈中实例化的数组,系统自动回收内存查看全部
-
此时不能直接用delete []p;来释放内存,要加p++让它指回循环之前的位置 for(int j=0;j<3;j++) { cout<<"p_x"<<p->m_iX<<endl; cout<<"p_y"<<p->m_iY <<endl; p--; } p++; delete []p; p=NULL; delete时没有[]将只会清除第一个元素的内存 会造成内存泄露 如果是堆中开辟了对象数组,delete p 则销毁的是第一个元素, delete []p 则会销毁一个对象数组查看全部
-
1.p[0]指向第一个元素;执行p++之后p[0]指向第2个了!!!<br> 2.释放内存时要注意指针 p 指回原来的位置。用delete释放数组内存时要注意此时的指针*p要指到该数组的第一个元素上。保证申请和释放的是同一段内存<br> ps:遍历通俗来讲就是打印出数组中每个元素的信息 释放内存时要注意指针 p 指回原来的位置。 堆中实例化数组<br> a. (初始)p -> m_iX 指代数组第一个元素 p++ 移位则指向第二个元素 则此时 p[1]访问第三个元素 b. p[0].m_iX 直接 . 指代实例化对象查看全部
-
int (void) { Coordinate coord[3]; coord[1].m_ix = 10; //定义栈 Coordinate *p = new Coordinate[3]; p[0].m_iY = 20; p ->m_iY = 20; delete []p; //定义堆 p = NULL; return 0; } 对象数组的两种定义方式<br> 栈中申请: Coordinate coord[3];<br> 堆中申请: Coordinate *p = new Coordinate[3]; 通过栈定义的数据成员和成员函数只能用.来访问。通过堆定义的数据成员的访问能用. 和->。 -> 只能用于有指针的。查看全部
-
拷贝构造函数是为了对象之间初始化赋值的,浅拷贝将新对象再一次指向了旧对象分配的内存单元,释放时容易崩溃。而深拷贝采用新的内存申请和循环赋值可以避免重复使用一个块内存。查看全部
-
当有指针的时候进行拷贝会使指针指向同一块内存,arr1修改值会使内存中的值发生改变,arr2修改值也会使内存中的值发生改变,致使arr1和arr2的值相同。释放内存时去释放指针也将会出现问题,计算机会崩溃。 我们要的是拷贝值,而不是使指针指向相同的内存。 当进行对象拷贝时不是简单的进行值的拷贝,而是将堆中内存的数据也进行拷贝,这种拷贝模式即为深拷贝。查看全部
-
对象成员和对象成员指针所占的字节数程序测试代码: #include <iostream> using namespace std; class A { private : int arr[5]; }; class B { private : A obj1; A obj2; }; class C { private : A *pA1; A *pA2; }; int main() { cout << "一个int占的字节数:" << sizeof(int) << endl; cout << "一个指针占的字节数:" << sizeof(A *) << endl; cout << "一个A类的实例占的字节数:" << sizeof(A) << endl; cout << "一个带有两个A类成员的B类的实例占的字节数:" << sizeof(B) << endl; cout << "一个带有两个指向A类实例的指针成员的C类实例占的字节数:" << sizeof(C) << endl; return 0; }查看全部
-
2、常成员函数内使用数据成员时,不能改变数据成员的值查看全部
举报
0/150
提交
取消