类与对象一

一 注意的点

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. Android深度探索HAL与驱动开发 第三章 Git入门

    Git功能十分复杂,简单来说它使你的开发更为快捷和可控,尤其是在开源项目上展现的友好的交互和回馈. 熟悉一些git指令操作对开发者的帮助可以避免开发者受到一些外在因素打断开发进度,甚至延误项目的che ...

  2. 【LINUX命令】之MV

    linux下重命名文件或文件夹的命令mv既可以重命名,又可以移动文件或文件夹. 例子:将目录A重命名为B mv A B 例子:将/a目录移动到/b下,并重命名为c mv /a /b/c 注意: mv命 ...

  3. Thread系列之Thread.Sleep(0)

    线程这一概念,可以理解成进程中的一个小单元.这个单元是一个独立的执行单元,但是与进程中的其他线程共享进程中的内存单元. 由于Cpu资源是有限的,所以进程中的多个线程要抢占Cpu,这也导致进程中的多个线 ...

  4. js中的this指针(五)

    js中的函数有一个很有意思的地方,即函数自身也方法. apply方法让我们可以建立一个参数数组并用其来调用函数. apply方法接受两个参数,第一个是将被绑定给 this 的值.第二个就是一个参数数组 ...

  5. ubuntu下安装rpm 文件

      正想着如何把rpm package 安装到ubuntu上, 发现了这篇文章,转载一下 Ubuntu的软件包格式是deb,如果要安装rpm的包,则要先用alien把rpm转换成deb. sudo a ...

  6. CSS 选择器(转)

    原文转自:http://www.cnblogs.com/xyzhanjiang/p/5447406.html CSS 选择器除了样式表匹配元素时需要用到,在使用 jQuery 等库的时候也可以利用 C ...

  7. 0.AutoMapper核心

    AutoMapper是基于约定的对象 - 对象映射器.AutoMapper使用流畅的配置API来定义对象 - 对象映射策略.AutoMapper使用基于约定的匹配算法来匹配源到目标值.AutoMapp ...

  8. 阿里云 crp kelude远程部署tomcat8 重启tomcat脚本

    部署包路径:/usr/local/tomcat/webapps 应用服务启动脚本路径:/usr/local/tomcat/bin/restart.sh 部署授权帐号:tomcat restart.sh ...

  9. (转)php-curl响应慢(开发微信授权登陆时碰到的问题)

    最近在做一个php小项目的时候,发现curl调用微信的授权api.weixin.qq.com,经常是需要等待很久,但是有时候却很快. 刚开始以为是网络慢问题,没去注意.后面通过打上时间日志观察发现,慢 ...

  10. MyBatis入门学习教程-解决字段名与实体类属性名不相同的冲突

    在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突. 一.准备演示需要使用的表和数据 CREATE TAB ...