1.c++类的声明和定义。

class student
{
public:
char *name;
int age;
float score;
void say();
};

void student :: say()
{
cout<<name<<", age:"<<age<<", score"<<score<<endl;
}

这里的函数可以先在类中声明,然后把定义放在外面。这样做完全合法,同时也便于阅读。
C++中类定义类的声明部分一般分为类声明部分和类的实现部分。类的声明部分用来说明类中的成员(数据成员,数据函数),告诉使用者干什么。
类实现部分用来定义成员函数,该函数用来对数据成员进行操作,告诉使用者怎么干。
类的定义的一般形式 :
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.构造函数

C++中定义了一种特殊的初始化函数,称为构造函数;当对象被调用时,构造函数自动调用;构造函数名字与类名相同,也没有返回类型和返回值;
对象在生成过程中通常需要初始化变量或分配动态内存,用构造函数。
#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;
}

这两种都是可以的。

注意点:在初始化列表中要注意赋值的先后顺序。如果不小心则会造成错误。看下面的demo
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){}这样的话,就错了。

运行结果如下
[root@localhost 0711]# ./a.out 
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.查看类和对象的大小

直接看demo

#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;
}

运行结果:

4
12
12

初入C++(二)类和对象,构造函数,析构函数相关推荐

  1. 【跟学C++】C++类与对象—构造函数—析构函数(Study10)

    文章目录 1.面向对象(类与对象) 1.1 类 1.2 对象 1.3 访问之句点运算符(.) 1.4 访问之指针运算符(->) 2.public(公有)和private(私有) 3.构造函数 3 ...

  2. 【C++】(二) 类和对象的定义与使用

    前期教程 [C++](一) C++初步,从C到C++ 一.概述   建议先看完上面那篇博客.这篇博客主要讲述C++中类和对象的定义与使用. 二.面向对象的基本概念   先介绍一些概念,建立理论印象. ...

  3. Python16-面向对象类和对象构造函数

    一.面向对象 1.概念 1.1面向对象的设计思想 面向对象是基于万物皆对象这个哲学观点.在Python中,一切皆对象 举例说明:案例一:我想要吃大盘鸡面向过程 面向对象1.自己去买菜 1.委托一个会砍 ...

  4. Java复习(二)类与对象的基本概念

    2.1面向对象的程序设计方法概述 对象 程序中: 一切皆是对象 都具有标识,属性和行为 通过一个或多个变量来保存其状态 通过方法实现他的行为 类 将属性及行为相同或相似的对象归为一类 类可以看成是对象 ...

  5. java实验二 类和对象

    类和对象 [实验目的] 1. 掌握如何定义类. 2. 掌握如何定义类的成员变量.成员方法. 3. 掌握如何创建对象.使用对象. 4. 掌握关键字static的用法. 5. 掌握类成员的访问权限. [实 ...

  6. cpp初阶--Lesson 04 类和对象(下)

    Lesson 04 类和对象(下) [本节目标] 1. 再谈构造函数 2. C++11 的成员初始化新玩法. 3. 友元 4. static成员 5. 内部类 6. 再次理解封装 虽然构造函数调用之后 ...

  7. 【C++初阶】3. 类和对象_2

    1. 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类. 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员 函数. 默认成员函数:用户没有显式实现,编 ...

  8. C++派生类含有成员对象构造函数析构函数顺序

    参考博客:传送门1 当类中含有对象成员时: 类的构造函数要包含对成员对象的初始化,如果构造函数的成员初始化列表没有包含对成员对象的初始化,系统会自动调用成员对象的无参构造函数.顺序上:先调用成员对象的 ...

  9. python四十二:类和对象

    类有数据属性和函数属性, 但对象只有数据属性. def funName(args):'函数文档字符串'函数体class 类名:'类的文档字符串'类体创建一个类class foo:pass用类foo实例 ...

  10. 《类和对象》-析构函数

    析构函数 概念 前面通过构造函数的学习,我们知道一个对象时怎么来的,那一个对象又是怎么没呢的? 析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的.而 对象在销 ...

最新文章

  1. 2019年上半年收集到的中国人工智能发展详情文章
  2. C++:cin、cin.getline()、getline()的用法
  3. eq linux_在线试用 200 多种 Linux 和 Unix 操作系统 | Linux 中国
  4. java token生成和验证_SpringBoot集成JWT生成token及校验方法过程解析
  5. ActiveX技术在WEB页上的应用[转载]
  6. 技术 | Python从零开始系列连载(二十三)
  7. vm14 Ubuntu16不能复制粘贴
  8. Arduino ESP32 最简单直接获取网络时间方法
  9. 环保线绕电阻器的主要特性和应用分析
  10. 硬件虚拟化检测工具:securable
  11. 域服务器安全策略应用,ad域服务器组策略命令
  12. 华为eNSP--4多个路由器连接配置(静态路由)
  13. 你知道甲醛的危害有多大吗?
  14. 国产电动汽车与特斯拉差多少?
  15. Egret 开发H5小游戏
  16. 密码学数学基础——群、环、域
  17. 手把手教你将矩阵画成张量网络图
  18. 移动 网络 连mysql_中国移动MySQL数据库优化最佳实践
  19. c语言基础 —— 程序结构
  20. 对技术的态度(酷壳)

热门文章

  1. 自然语言处理基础知识HR
  2. AttributeError: module 'sys' has no attribute 'maxint'
  3. Python爬虫项目:抓取智联招聘信息
  4. MFC开发IM--MFC非模态对话框的创建及显示
  5. Reddit前CEO黄易山:马斯克不懂言论自由的挑战
  6. 150W光速秒充!realme真我GT Neo3正式发布 售价1999元起
  7. iPhone 14进入代工试产阶段:首款打孔屏iPhone要来了
  8. 小米12系列核心配置曝光:骁龙898+双百瓦快充+2亿像素主摄
  9. 博通2021财年第三季度营收67.8亿美元,半导体业务营收50亿美元
  10. 罗永浩:交个朋友直播间单日支付金额突破1亿元