初入C++(二)类和对象,构造函数,析构函数
1.c++类的声明和定义。
{
public:
char *name;
int age;
float score;
void say();
};
void student :: say()
{
cout<<name<<", age:"<<age<<", score"<<score<<endl;
}
类实现部分用来定义成员函数,该函数用来对数据成员进行操作,告诉使用者怎么干。
类的定义的一般形式 :
class <类名 >
{
public:
<成员函数或变量 >;
protected:
<成员函数或变量 >;
privated:
<成员函数或变量 >;
};
#include <iostream>
using namespace std;class data //类的声明部分
{
public:void setdata(int y, int m, int d);int isleapyear();void print();
private:int year;int month;int day;
}; //到此为止void data :: setdata(int y, int m, int d) //类的实现部分
{year = y;month = m;day = d;
}int data :: isleapyear()
{if (((year %4 == 0) && (year %100 != 0)) || (year %400 == 0)){return 1;}else{return 0;}
}void data :: print()
{cout<<year<<"."<<month<<"."<<day;
} //到此为止int main()
{int flag;data dat1;dat1.setdata(1995,2,20);flag = dat1.isleapyear();if (1 == flag){dat1.print();cout<<" is leapyear"<<endl;}else{dat1.print();cout<<" is not leapyear"<<endl;}return 0;
}
类体定义类的成员:
1)数据成员:它们指定了该类对象的内部表示 ;
2) 成员函数:它们指定该类的操作;
类成员有3种不同的访问权限:
1.public: 既可以被本类中的成员函数访问,也可以被类的作用域内的其他函数访问;
2.private: 只能被该类的成员函数访问,类外的其他函数则不能;
3.protected:只能被该类的成员函数和派生类的成员函数访问。
不指定就默认私有。
2.对象的定义和使用
对象定义格式为:
<类名><对象名表>
例:
Cdata data1,data2, *Pdata,data[3];
对象的成员格式:
<对象名>.<成员名>(<参数表>)
#include <iostream>
using namespace std;
//下面为类的声明部分
class Carea
{
private:
int x, y; //声明两个私有变量x和y
public:
void set_values (int a,int b); //声明设置矩形长宽值的函数,用来为私有变量赋值
int area(); //声明计算面积的成员函数
};
//下面为矩形面积类的实现部分
void Carea::set_values (int a, int b)
{ //设置长宽值,使对象获取数据
x = a; //私有变量x获取数据
y = b; //私有变量y获取数据
}
int Carea::area ()
{
return (x*y); //通过函数值返回面积
}
int main ()
{
Carea rect1, rect2; //声明两个对象rect1和rect2
rect1.set_values (3,4); //为对象rect1的成员函数的参数赋值
rect2.set_values (5,6); //为对象rect2的成员函数的参数赋值
cout << "rect1 area: " << rect1.area() << endl;
cout << "rect2 area: " << rect2.area() << endl;
return 0;
}
3.构造函数
对象在生成过程中通常需要初始化变量或分配动态内存,用构造函数。
#include <iostream>
using namespace std;class carea{
private:int length;int width;
public:carea(int a, int b);//构造函数声明int area();//计算面积的成员函数的声明
};
//以下为构造函数的定义
carea :: carea(int a, int b)
{length = a;width = b;
}int carea :: area()
{return length*width;
}int main()
{carea ar1(30, 20); //创建rect1对象并调用构造函数进行初始化cout<<ar1.area()<<endl;return 0;
}
还有一种情况,构造函数是可以重载的。那么当构造函数重载是什么情况,请看代码。
#include <iostream>
using namespace std;class student{
private:char *m_name;int m_age;float m_score;
public:student(); //这里就是构造函数的重载student(char *name, int age, float score);void setdata(char *name, int age, float score);void show();
};student :: student():m_name(NULL), m_age(0), m_score(0){} //构造函数什么都不做 只是对于公开的数据进行了复赋值。
/*{m_name = NULL; //C++结构函数的初始化列表。m_age = 0;m_score = 0;
}*/student :: student(char *name, int age, float score):m_name(name), m_age(age), m_score(score){}
/*{m_name = name; //C++结构函数的初始化列表。m_age = age;m_score = score;
}*/void student :: setdata(char *name, int age, float score)
{m_name = name;m_age = age;m_score = score;
}void student :: show()
{cout<<m_name<<" "<<m_age<<" "<<m_score<<endl;
}int main()
{student stu1("xiangming", 19, 59.8); //调用重载的构造函数的时候,用的是与之参数对应的构造函数stu1.show();student stu2; //student stu2();在有的比较新的编译器中,这样写也是正确的。stu2.setdata("xiangwang", 20, 56.6);stu2.show();student *ptr1 = new student("xiaoliu", 19, 66.6);ptr1->show();student *ptr2 = new student; //调用重载的构造函数的时候,用的是与之参数对应的构造函数ptr2->setdata("xiaotang", 22, 99.9);ptr2->show();delete ptr1;delete ptr2;return 0;
}
4.c++中构造函数的初始化列表
student :: student (char *name, int age, float score):m_name(name), m_age(age), m_score(score){}student :: student (char *name, int age, float score):m_name(name), m_age(age)
{,m_score = score;
}
这两种都是可以的。
class demo{
private:int m_a;int m_b;
public:demo(int b);void show();
};demo :: demo(int b):m_a(b), m_b(m_a){}void demo :: show()
{cout<<m_a<<","<<m_b<<endl;
}int main()
{demo obj(100);obj.show();return 0;
}
如果这里的demo :: demo(int b):m_a(b), m_b(m_a){}写成demo :: demo(int b):m_b(b), m_a(m_b){}这样的话,就错了。
9077696,100
5. 析构函数
#include <iostream>
using namespace std;class carea{
private:int *width;int *height;
public:carea(int a, int b);~carea();int area();
};carea :: carea(int a, int b)
{width = new int;height = new int;*width = a;*height = b;
}carea :: ~carea()
{delete width; //释放指针变量width占用的内存资源delete height; //释放指针变量height占用的内存资源cout<<"set free"<<endl; //调用析构函数的信息提示
}int carea :: area()
{return ((*width) * (*height));
}int main()
{carea are1(3, 4), are2(5, 6);cout<<"1 area"<<are1.area()<<endl;cout<<"2 area"<<are2.area()<<endl; //在程序运行完之前,析构函数自动执行。return 0;
}
析构函数调用顺序
#include <iostream>
using namespace std; //是指标准库中输入输出流的头文件, cout就定义在这个头文件里class Test //定义类
{private: //私有变量int num;public:Test(int a) //定义构造函数{num = a;cout<<"第"<<num<<"个Test对象的构造函数被调用"<<endl;}~Test() //定义析构函数{cout<<"第"<<num<<"个Test对象的析构函数被调用"<<endl; }};int main(){cout<<"进入main()函数"<<endl;Test t[4] = {0,1,2,3}; //定义4个对象,分别以0、1、2、3赋给构造函数的形参acout<<"main()函数在运行中"<<endl;cout<<"退出main()函数"<<endl;return 0;
}
6.查看类和对象的大小
#include <iostream>
using namespace std;class student{
private:char *m_name;int m_age;float m_score;
public:void setname(char *name){m_name = name;}void setage(int age){m_age = age;}void setscore(float score){m_score = score;}void show(){cout<<m_name<<","<<m_age<<","<<m_score<<endl;}
};int main()
{student *ptr = new student;cout<<sizeof(ptr)<<endl;cout<<sizeof(*ptr)<<endl;cout<<sizeof(student)<<endl;ptr->show();return 0;
}
运行结果:
初入C++(二)类和对象,构造函数,析构函数相关推荐
- 【跟学C++】C++类与对象—构造函数—析构函数(Study10)
文章目录 1.面向对象(类与对象) 1.1 类 1.2 对象 1.3 访问之句点运算符(.) 1.4 访问之指针运算符(->) 2.public(公有)和private(私有) 3.构造函数 3 ...
- 【C++】(二) 类和对象的定义与使用
前期教程 [C++](一) C++初步,从C到C++ 一.概述 建议先看完上面那篇博客.这篇博客主要讲述C++中类和对象的定义与使用. 二.面向对象的基本概念 先介绍一些概念,建立理论印象. ...
- Python16-面向对象类和对象构造函数
一.面向对象 1.概念 1.1面向对象的设计思想 面向对象是基于万物皆对象这个哲学观点.在Python中,一切皆对象 举例说明:案例一:我想要吃大盘鸡面向过程 面向对象1.自己去买菜 1.委托一个会砍 ...
- Java复习(二)类与对象的基本概念
2.1面向对象的程序设计方法概述 对象 程序中: 一切皆是对象 都具有标识,属性和行为 通过一个或多个变量来保存其状态 通过方法实现他的行为 类 将属性及行为相同或相似的对象归为一类 类可以看成是对象 ...
- java实验二 类和对象
类和对象 [实验目的] 1. 掌握如何定义类. 2. 掌握如何定义类的成员变量.成员方法. 3. 掌握如何创建对象.使用对象. 4. 掌握关键字static的用法. 5. 掌握类成员的访问权限. [实 ...
- cpp初阶--Lesson 04 类和对象(下)
Lesson 04 类和对象(下) [本节目标] 1. 再谈构造函数 2. C++11 的成员初始化新玩法. 3. 友元 4. static成员 5. 内部类 6. 再次理解封装 虽然构造函数调用之后 ...
- 【C++初阶】3. 类和对象_2
1. 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类. 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员 函数. 默认成员函数:用户没有显式实现,编 ...
- C++派生类含有成员对象构造函数析构函数顺序
参考博客:传送门1 当类中含有对象成员时: 类的构造函数要包含对成员对象的初始化,如果构造函数的成员初始化列表没有包含对成员对象的初始化,系统会自动调用成员对象的无参构造函数.顺序上:先调用成员对象的 ...
- python四十二:类和对象
类有数据属性和函数属性, 但对象只有数据属性. def funName(args):'函数文档字符串'函数体class 类名:'类的文档字符串'类体创建一个类class foo:pass用类foo实例 ...
- 《类和对象》-析构函数
析构函数 概念 前面通过构造函数的学习,我们知道一个对象时怎么来的,那一个对象又是怎么没呢的? 析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的.而 对象在销 ...
最新文章
- 2019年上半年收集到的中国人工智能发展详情文章
- C++:cin、cin.getline()、getline()的用法
- eq linux_在线试用 200 多种 Linux 和 Unix 操作系统 | Linux 中国
- java token生成和验证_SpringBoot集成JWT生成token及校验方法过程解析
- ActiveX技术在WEB页上的应用[转载]
- 技术 | Python从零开始系列连载(二十三)
- vm14 Ubuntu16不能复制粘贴
- Arduino ESP32 最简单直接获取网络时间方法
- 环保线绕电阻器的主要特性和应用分析
- 硬件虚拟化检测工具:securable
- 域服务器安全策略应用,ad域服务器组策略命令
- 华为eNSP--4多个路由器连接配置(静态路由)
- 你知道甲醛的危害有多大吗?
- 国产电动汽车与特斯拉差多少?
- Egret 开发H5小游戏
- 密码学数学基础——群、环、域
- 手把手教你将矩阵画成张量网络图
- 移动 网络 连mysql_中国移动MySQL数据库优化最佳实践
- c语言基础 —— 程序结构
- 对技术的态度(酷壳)
热门文章
- 自然语言处理基础知识HR
- AttributeError: module 'sys' has no attribute 'maxint'
- Python爬虫项目:抓取智联招聘信息
- MFC开发IM--MFC非模态对话框的创建及显示
- Reddit前CEO黄易山:马斯克不懂言论自由的挑战
- 150W光速秒充!realme真我GT Neo3正式发布 售价1999元起
- iPhone 14进入代工试产阶段:首款打孔屏iPhone要来了
- 小米12系列核心配置曝光:骁龙898+双百瓦快充+2亿像素主摄
- 博通2021财年第三季度营收67.8亿美元,半导体业务营收50亿美元
- 罗永浩:交个朋友直播间单日支付金额突破1亿元