类与对象一

一 注意的点

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. #ifndef 的用法

    背景: 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件,会引起大量的声明冲突,这时候需 ...

  2. SQL Server系统存储过程

    1. execute sp_databases   查询当前所有数据库大致信息(名称,大小等) 2. exec sp_helpdb [Myschool] 返回数据库的所有详细信息(数据库大小,位置,文 ...

  3. Fiddler (HTTP抓包)简介

    1.什么是Fiddler? Fiddler是位于客户端和服务器端的HTTP代理,也是目前最常用的http抓包工具之一.它能够记录客户端和服务器之间的所有HTTP请求,可以针对特定的HTTP请求,分析请 ...

  4. <%@page contentType="text/html;charset=gbk"%>与<meta http-equiv="Content-Type" content="text/html; charset=GBK">区别

    前一个是在服务端起作用,是告诉应用服务器采用何种编码输出JSP文件流,后一个是在客户端起作用,是告诉浏览器是采用何种编码方式显示HTML页面.     前者由jsp引擎对输出内容进行编码, 后者将由I ...

  5. [转]使用Maven添加依赖项时(Add Dependency)时,没有提示项目可用,并且在Console中,输出: Unable to update index for central|http://repo1.maven.org/maven2 。

    使用Maven添加依赖项时(Add Dependency)时,没有提示项目可用,并且在Console中,输出: Unable to update index for central|http://re ...

  6. Quartz conTrigger 定时器表达式大全

    CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年]  序号 说明   是否必填  允许填写的值 允许的通配符   1  秒  是  0-59    , ...

  7. spring加载bean实例化顺序

    问题来源: 有一个bean为 A,一个bean为B.想要A在容器实例化的时候的一个属性name赋值为B的一个方法funB的返回值. 如果只是在A里单纯的写着: private B b;private ...

  8. JSON.stringify 在OA差旅中转换为字符串传给后端,(使用from表单的形式)

    $('#bookForm').find('#formData').val(transInfo.fromData).end().submit(); 这里的val()中的transInfo.fromDat ...

  9. MVC视图请求流程视图

    /*         *视图请求流程         *当接受到home/index请求时         *先去找viewstart.cshtml视图,再去加载index.cshtml视图      ...

  10. Legacy Notes网络和服务端配置的笔记

    在云服务器上使用LAMP全过程: 第一步:传文件 在windows上下载winscp,连接使用scp协议.注意:centos需要安装scp yum install openssh-clients 即可 ...