类与对象一

一 注意的点

1 利用构造函数给数据成员初始化的两种办法:1 赋值语句,2 用成员初始化列表

解释:1 成员初始化列表的一般形式为:

数据成员名1(初始值1),数据成员名2(初始值2)

2 在C++中某些类型的成员是不允许在构造函数中用赋值语句直接赋值的。例如, 对于用const修饰的数据成员,或是引用类型的数据成员,是不允许用赋值语句直接赋值的。因此,只能用成员初始化列表对其进行初始化。

 

2 编译系统自动地调用析构函数情况

  1 主程序main()运行结束

  2 如果一个对象被定义在一个函数体内,则当这个函数结束时,改对象的析构函数被自动调用

  3 若一个对象是使用new运算符动态创建的,在使用delete运算符释放它的时候会自动调用析构函数

 

3 拷贝构造函数

  1 该函数与类同名,并且不能指定返回值类型(因为它也是一种构造函数)

 

  2 该函数只有一个参数,并且是同类对象的引用。

  3  每个类必须有一个拷贝构造函数。

 

#include<iostream>

using namespace std;

class Point       {

 public:

  Point(int a,int b)       //定义构造函数

  { x=a; y=b; cout<<"Using  normal constructor\n";}

  Point(const Point &p)    //定义拷贝构造函数

  { x=2*p.x;y=2*p.y; cout<<"Using copy constructor\n";}

  void print() { cout<<x<<"  "<<y<<endl; }

 private:

  int x,y; };

 void fun1(Point p){p.print();}//函数fun1的形参是类对象

int main()

{ Point p1(30,40);//定义对象p1时,第1次调用普通的构造函数

  fun1(p1);       //在调用函数fun1,实参与形参结合时,

  return 0;      }     //第2次调用拷贝构造函数

 

 

4 浅拷贝和深拷贝

   1 所谓浅拷贝,就是由默认的拷贝构造函数所实现的数据成员遂一赋值

      注:通常默认的拷贝构造函数是能够胜任工作的,但若类中含有指针类型的数据,这种按数据成员遂一赋值的方法将会产生错误。

  #include<iostream.h>//浅拷贝函数当遇到指针类型数据进行数据拷贝的时候会出现指针悬挂

#include<string>

class Student{

public:Student(char *name1,float score1);

                      ~Student();

private:char *name;

                   float score;

};

Student::Student(char *name1,float score1)

{

         cout<<"Constructing..."<<name1<<endl;

         name=new char[strlen(name1)+1];

         if(name!=0)

         {

                   strcpy(name,name1);

                   score=score1;

         }

}

Student::~Student()

{

         cout<<"Destructing..."<<name<<endl;

         name[0]='\0';

         delete []name;

}

int main()

{

         Student stu1("liming",90);

         Student stu2=stu1;

         return 0;

}

 

为解决这个问题,我们需要显式地定义一个自己的拷贝构造函数,使之不但拷贝数据成员,而且为对象stu1和stu2分配各自的内存空间,这就是所谓的深拷贝。

 

#include<iostream.h>//浅拷贝函数当遇到指针类型数据进行数据拷贝的时候会出现指针悬挂,用浅拷贝解决这个问题

#include<string>

class Student{

public:Student(char *name1,float score1);

            Student(Student &stu);

                      ~Student();

private:char *name;

                   float score;

};

Student::Student(char *name1,float score1)

{

         cout<<"Constructing..."<<name1<<endl;

         name=new char[strlen(name1)+1];

         if(name!=0)

         {

                   strcpy(name,name1);

                   score=score1;

         }

}

Student::Student(Student &stu)//定义一个自己的拷贝构造函数,单独为stu1和stu2分配各自的内存空间

{

         cout<<"Copy constructing..."<<stu.name<<endl;

         name=new char[strlen(stu.name)+1];

                   if(name!=0)

                   {

                            strcpy(name,stu.name);

                            score=stu.score;

                   }

}

Student::~Student()

{

         cout<<"Destructing..."<<name<<endl;

         name[0]='\0';

         delete []name;

}

int main()

{

         Student stu1("liming",90);

         Student stu2=stu1;

         return 0;

}

 

 

 

c++学习--面向对象一的更多相关文章

  1. python语法学习面向对象之继承

    python语法学习面向对象之继承 转载自:http://www.cnblogs.com/Joans/archive/2012/11/09/2757368.html 只要涉及到面向对象,”类“是必须出 ...

  2. 转 python语法学习面向对象之继承

    传送门 python语法学习面向对象之继承 只要涉及到面向对象,”类“是必须出现的一个代名词. 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象是这个类的实例. 类的一些概念: 包括初始 ...

  3. Lua学习----面向对象编程

    1.类 再Lua中可以使用表和函数实现面向对象,将函数和相关的数据放置放置于同一个表中就形成了对象.例如: Measure = {width = 0, height = 0} function Mea ...

  4. 学习面向对象编程OOP 第二天

    好,今天继续学习这个面向对象编程.(根据博客园 小炒花生米写的博客学习而来) 一,封装性 a.把对象的全部属性和全部服务(方法)结合在一起,形成一个不可分割的独立单元 =>对象 b.信息隐蔽,尽 ...

  5. 学习面向对象编程OOP 第一天

    面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...

  6. python学习------面向对象的程序设计

    一 面向对象的程序设计的由来 1940年以前:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数 据.简单来说,就是直接编写 和 的序列来代表程序语言 ...

  7. Python学习---面向对象的学习[基础]

    面向对象 面向对象的三大特性是指:封装.继承和多态. 说明: Python可以函数式编程,也可以面向对象编程 l 面向过程:根据业务逻辑从上到下写垒代码 l 函数式 :将某功能代码封装到函数中,日后便 ...

  8. Python学习---面向对象的学习[深入]

    类的深入学习    a. Python中一切事物都是对象     b. class Foo:             pass                obj = Foo()         # ...

  9. Java学习---面向对象的远程方法调用[RMI]

    基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...

  10. Python入门基础学习(面向对象)

    Python基础学习笔记(四) 面向对象的三个基本特征: 封装:把客观事物抽象并封装成对象,即将属性,方法和事件等集合在一个整体内 继承:允许使用现有类的功能并在无须重新改写原来的类情况下,对这些功能 ...

随机推荐

  1. rpm 软件管理

    rpm包 安装,查询,卸载,升级,校验数据库的重建等工作 1.安装rpm -i /PATH/TO/PACKAGE_FILE -h: 以#显示进度:每个#表示2%;  -v: 显示详细过程 -vv: 更 ...

  2. Django后台post请求中的csrf token

    使用Requests库操作自己的Django站点,post登陆admin页面返回403,serverlog显示csrf token not set. csrf token是get登陆页面时服务器放在c ...

  3. Spring 发送 Email

    本文转自:http://zl198751.iteye.com/blog/757617 看到了本文,收获颇丰,感谢之至! 首先介绍下Email的发送流程: 需要选中smtp邮件服务器,Yahoo不提供免 ...

  4. [C++] Running time and Integer to String

    std::string num2str(int64_t p_vint, int8_t p_radix) { char str[48] = { 0 }; int64_t temp = 0; int64_ ...

  5. 关于js的keycode13

    一个form 里面只有一个input的时候  触发keydown 之类的事件  表单会在你的动作之外再次提交一次.并且 字段使用的是input的id  而不是name  可以在form上加一个onsu ...

  6. OpenGL法向量变换

    OpenGL光照开启时,法向量用于决定特定顶点或面上接受到光照的多少.光照处理过程作用于观察坐标空间,因此,模型对象坐标系的法向量也需要使用GL_MODELVIEW矩阵变换到观察坐标系. 然而,法向量 ...

  7. docker本地私有仓库的创建,及https错误修正

    docker版本1.12.5 #docker run -d -p 5000:5000 -v <HOST_DIR>:/tmp/registry-dev registry #<HOST_ ...

  8. ISO20000

    ISO20000IT运维服务标准流程: 策划 建立 实施 运行 监控 回顾 维护 改进 方法论PDCA: Plan Do Check Act

  9. 经验分享:Linux 双网卡 不同网段 网络互通

    环境如下: 现状:一台linux主机上有两个网卡eth0 和eth1 ,机器能访问192网的服务资源,但不能访问10网段的资源. 要求:linux能通过eth1访问10网段的资源 路由: 网卡: 操作 ...

  10. Linux LVM硬盘管理之一:概念介绍

    一.LVM概念介绍: LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现.LVM将一个或多个硬盘的分区在逻 ...