C++类方法声明实现与调用
2026/4/18 3:32:41 网站建设 项目流程
class CTest //声明一个类,类名为Ctest { private: /*类的私有变量*/ int *x,*y;//x是个指针 /* data */ public: /*类的公有变量*/ int Add(int a, int b);//增加自写函数 //Ctest是与类名同名的构造函数,里面可传参数,也可以不传,默认是不传参数;一个类可有多个构造函数 CTest();//声明类的构造方法,什么叫构造?就是类初始创建开始调用的时候就会调用到这个方法,与类名一致 CTest(int x,int y); ~CTest();//声明类的析构函数,//类在被释放的时候就会调用析构函数,取反符号 }; //实现类Add的方法 int CTest::Add(int a, int b) { return a + b; }

调用类的成员函数,只有2 种方式

1)指针调用:用->箭头

适用于:对象指针、new 出来的对象

2)对象直接调用:用.点号

适用于:栈对象、普通对象变量

本来输出结果是:

但为什么我的输出结果是:

class demo

111类的构造方法

p50

a=3,b=4

111类的构造方法

obj10

222类的析构方法

是因为写了两个超级危险的错误:

  1. 无参构造函数里,没有给 x、y 分配内存
  2. *析构函数里,直接x = 0,对野指针赋值,直接崩溃

下面代码已修正

正确输出为:

class demo

111类的构造方法

p50

a=3,b=4

111类的构造方法

obj10

222类的析构方法

222类的析构方法

222类的析构方法

最后有3个是因为:栈对象objCTest生命周期结束,自动销毁 → 自动调用析构!

#include "demo.h" #include <stdio.h> #include <string.h> #include <iostream> #include <sstream> #include <windows.h> // 必须加 #include <unistd.h> using namespace std; class CTest //声明一个类,类名为CTest { private: /*类的私有变量*/ int *x,*y;//x是个指针 /* data */ public: /*类的公有变量*/ int Add(int a, int b);//增加自写函数 //Ctest是与类名同名的构造函数,里面可传参数,也可以不传,默认是不传参数;一个类可有多个构造函数 CTest();//声明类的构造方法,什么叫构造?就是类初始创建开始调用的时候就会调用到这个方法,与类名一致 CTest(int x,int y); ~CTest();//声明类的析构函数,//类在被释放的时候就会调用析构函数,取反符号 }; //实现类Add的方法 int CTest::Add(int a, int b) { return a + b; } //类的构造方法,无参构造函数 CTest::CTest() { printf("111类的构造方法\n"); //无参构造也要给指针初始化 x = NULL; // 必须加 y = NULL; // 必须加 } //类的构造方法,有参构造函数 CTest::CTest(int a,int b)//既然是指针,那这儿传进来的就是地址 { printf("a=%d,b=%d\n",a,b); this->x = new int;//给指针x先分配一个内存 *this->x = a;//将指针所指向的内存地址的内容进行修改,成为传进来的x this->y = new int; *this->y = b; } //类的析构方法 CTest::~CTest() { printf("222类的析构方法\n"); //析构时需要把这两个指针里面的内容,重置为NULL // *this->x = 0; // *this->y = 0; //或者直接把地址清除 // 正确写法:释放 new 出来的内存 delete this->x; delete this->y; // 释放后置空 this->x = NULL; this->y = NULL; } int main(int argc,char *argv[]) { printf("class demo\n"); //声明类,类的对象叫myTest CTest *myTest = new CTest(); //声明了一个CTest类的指针myTest;111类的构造方法 //创建栈对象,自动调用无参构造,打印 111。 int result = myTest->Add(20,30); printf("p%d\n",result); //p50 // myTest->~CTest(); //222类的析构方法; //这句话不规范析构函数:一般不手动调用,delete / 离开作用域 自动调用 CTest *myTest1 = new CTest(3,4); //a=3,b=4 CTest objCTest; //声明了一个CTest类的对象;111类的构造方法 //创建栈对象,自动调用无参构造,打印 111。 int k = objCTest.Add(8,2); //obj10 printf("obj%d\n",k); delete myTest; //创建了最好就要销毁;222类的析构方法 delete myTest1; //222类的析构方法 return 0; }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询