类与对象一

一 注意的点

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. jsp基础知识

  2. SQL增删改语句常用

    创建table: create table tab_name( col1 type; 约束:主键-外键-非空-检查-唯一 col2 type; ); 删除表 : drop table tab_name ...

  3. sublime Text 2 配置以及 Python环境搭建

    在搭建Python环境前,先设置好Sublime Text 2的环境. 一.Sublime Text 2配置: 1.离线安装: Perferences-->Browser Packages -- ...

  4. JSPatch 实现原理详解

    原文地址https://github.com/bang590/JSPatch/wiki/JSPatch-%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E8%AF%A6%E8 ...

  5. qsort C++ VS2013 leetcode

    class Solution { private: static int compare(const void * a, const void * b) { return (*(int*)a - *( ...

  6. Extnet Direct 提交后台事件文件下载设置

    App.direct.MasterData.Export(App.tfSearch.getValue(), {                    isUpload: true            ...

  7. LeetCode---Hash Table

    299. Bulls and Cows 思路:抽屉法,放进secrets,拿出guess,最终cows = cows - bulls public String getHint(String secr ...

  8. html5 实现网页截屏 页面生成图片(图文)

    html2canvas通过获取页面的DOM和元素的样式信息,并将其渲染成canvas图片,从而实现给页面截图的功能. 因为每个浏览器渲染页面的方式都不尽相同,所以生成的图片也不太一样. 环境要求: j ...

  9. Android 自定义事件监听器

    当我们自定义View的时候,如果需要返回值,那么就需要自定义一个监听器. 这里用一个自定义的数字选框为例. 首先定义view. 1.新建view,NumberKeyboardView.Java,自定义 ...

  10. MyBatis与Hibernate的比较

    Hibernate 与Mybatis都是流行的持久层开发框架,但Hibernate开发社区相对多热闹些,支持的工具也多,更新也快,当前最高版本4.1.8.而Mybatis相对平静,工具较少,当前最高版 ...