欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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一种方式,这样确实简单很多。