类与对象一

一 注意的点

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. 通过sougou输入法,解决卡在Setup Wizard(小绿人)界面

    本人使用海信EG900手机(安卓2.3.5,已root),为了使用google的服务,先后手动复制和CWM recovery刷入google服务包(gapps-gb-20110828-signed.z ...

  2. 安装Nginx的Dockerfile实例

    #################################################Dockerfile to build Nginx Installed Containers##Bas ...

  3. CE STEPLDR

    作用:初始化CPU.内存.Flash,复制EBoot到内存并跳入EBoot中运行. 原理:S3C2416有 8-KB 的steppingstone(暂时翻译为垫脚石),在Nand启动模式下可把Nand ...

  4. tar命令

    # tar -cvf /usr/local/auto_bak/test.tar /usr/local/test 仅打包,不压缩 # tar -zcvf /usr/local/auto_bak/test ...

  5. 基于jQuery的email suggest插件

    最近项目中有表单提交的地方需要用户填写邮箱,PM(产品经理)和运营都强烈要求在用户填写邮箱的时候出现suggest列表,简化用户输入的填写流程.我考虑了下,这个应该也是经常会用到的功能,细心的朋友可能 ...

  6. css实现自适应屏幕高度;

    css实现自适应屏幕高度: <!DOCTYPE html><html lang="en"><head> <meta charset=&qu ...

  7. InfoPi运行机制介绍

    整体工作框架 文件目录结构 数据库设计 程序开发框架 注:图片可能被自动缩小,可以另存看大图 1.整体工作框架. 通用户关注绿色竖线左侧的内容即可 2.InfoPi的文件目录结构. 请留意一下cfg目 ...

  8. svn提交报e200007错误

    org.apache.subversion.javahl.ClientException: svn: E200007: Commit failed异常解决,svncommitfailed 首先2分钟前 ...

  9. entity framework自动迁移

    第一步,建立测试项目,普通的WinForm类型,EntityMigration: 第二步,从NuGet为项目添加MySql.Data.Entity,由Oracle提供,我选择人气高的: 第三步,建立实 ...

  10. DBA-mysql-字符集

    查看支持的字符集:show charset; 查看现使用字符集:status; 1.在[mysqld]下添加 default-character-set=utf8 (mysql 5.1版本) char ...