C++ Class的实例化方式(Java对比)
程序员文章站
2022-05-23 17:36:24
...
Context
最近学习C++,之前也就是大学二级的水平,还自以为懂了。现在一看,呵呵…
我是Java5年了,感觉和C++的class struct unit实例化差异很大。
Classes
Classes are an expanded concept of data structures: like data structures, they can contain data members, but they can also contain functions as members.
Classes包含
- class
- 默认member(方法、属性)的可见性为 private
- struct, unit
- 默认member 的可见性为 public
Class 实例化
1.
实例化两个对象rect1, rect2。
class Rectangle {
int width, height;
public:
void set_values (int,int);
int area (void);
} rect1, rect2;
实际和 int a
一样,type在前 variable name在后
2. constructor
// class_name object_name = initialization_value;
// class_name object_name { value, value, value, ... }
Circle foo (10.0); // functional form
Circle bar = 20.0; // assignment init.
Circle baz {30.0}; // uniform init.
Circle qux = {40.0}; // POD-like
完整代码
// classes and uniform initialization
#include <iostream>
using namespace std;
class Circle {
double radius;
public:
Circle(double r) { radius = r; }
double circum() {return 2*radius*3.14159265;}
};
int main () {
Circle foo (10.0); // functional form
Circle bar = 20.0; // assignment init.
Circle baz {30.0}; // uniform init.
Circle qux = {40.0}; // POD-like
cout << "foo's circumference: " << foo.circum() << '\n';
return 0;
}
默认构造
Rectangle rectb; // default constructor called
Rectangle rectc(); // function declaration (default constructor NOT called)
Rectangle rectd{}; // default constructor called
3. 动态初始化
Rectangle * prect = new Rectangle (5, 6);
内存分配在heap上,必须显式的回收内存 delete prect
Tips
如果 objectA在method1()里创建,在method2()里调用。
则需要用动态初始化,而不能用2.的初始化。
因为2的内存在超出method1()就可能被回收了。
实例
int main()
{
BinaryTreeNode rootNode;
rootNode.m_nValue = 2;
BinaryTreeNode *pRootNode = &rootNode;
init(pRootNode);
printTop2Bottom(pRootNode);
// release(pRootNode);
return 0;
}
- 我在init中创建BinaryTree(二叉树)
- 在printTop2Bottom中遍历
- 如果init时
BinaryTreeNode* node2
创建节点,node2.value = 2
赋值 - printTop2Bottom中声明一个 对象
std::deque<BinaryTreeNode *> dequeTreeNode;
- node2.value就会变化(Error)
- 但用
BinaryTreeNode node2 = new BinaryTreeNode()
,就不会有问题
原因就是new是在heap上,BinaryTreeNode* node2
应该类比于Java的方法栈里的局部内存,所以中printTop2Bottom实例化对象时dequeTreeNode,就把原node2内存重写了
Java对比
Java是直接没用 第1、2两种方式,只有new Class一种方式,这样确实简单很多。