50,C++(04)

来源:互联网 发布:九回时间旅行 知乎 编辑:程序博客网 时间:2024/05/16 01:51

/*
达内学习 C++ day48 2013-11-8
*/
四,构造函数
  1,无返回值,构建对象时调用一次初始化对象,给成员赋值
  2,参数默认值,减少构造函数重载个数
  3,不写时,默认构造无参公开
  4,一个对象的创建过程
   a,根据类型分配空间
   b,基本类型什么都不做
      类类型   默认调用类的无参构造
   c,调用类型构造函数的代码
五,类的声明 和 实现的分离
  1,写类的头文件
   成员变量的定义 构造函数成员函数的声明
  2,写类的实现文件
   导入头文件 #include "**.h"
  只留下函数 函数名前面加  类型::
  3,写测试文件
六,this 指针
  用在构造函数中  代表正在被创建的对象的地址
  用在成员函数中  谁调用代表谁的指针
 this 作为参数 和 返回值
七,关于权限  实际是编译对类型访问数据的限制,如果不通过类型访问(全局代码段访问)就不受限制。
gdb 调试
g++ -g  **.cpp   //生成调试信息的a.out
gdb a.out 
b(break) main //在main函数打断点  也可以b 15 停到15行
run  a.out //执行到main
n(next)  //继续向下执行
s(step)  //跳进函数
八,const 对象和 const 函数
  const 类型 对象名;
   1,只能调用const类型的成员函数
   2,const 函数和 非 const 函数可以构成重载
   3,非const对象优先选择非const 如果没有const函数则调用const函数
  4,const 函数的限制:
     const 函数不能修改对象的成员变量
     const 函数只能调用 const 函数
  5,如果想在const函数中修改对象的成员变量
   则类成员变量声明时候需要修饰成 mutable
九,析构函数
  一种特殊的函数
  在构造函数前加  ~
  在对象销毁前自动调用一次  但是允许调用多次

 什么时候需要自定义析构函数
  当有堆内存时(进程结束 调用相应释放内存的函数 或者运算符)
十,拷贝构造函数
   使用一个已经有的对象创建一个同类型的对象。
a,  拷贝构造函数的调用时机
   1,使用同类型的对象创建对象
     A  a;
     A  b=a;
   2,函数传递参数时
    void testA(A a)
    {
      A a;
     testA(a);
   }
   3,函数的返回值
    A getA(A& a)
   {
      return a;
   }
b,系统提供的是逐字节拷贝
c,拷贝构造函数的自定义实现
  类型(const 类型& 变量)
  {
     /*  拷贝构造函数 */
  } 
 只有当对象中有堆内存时,需要释放时候,才考虑自定义拷贝构造函数。
d,使用拷贝构造特殊情况
  编译器优化

只要类中有指针类型的成员  构造函数中要考虑给指针分配内存,在析构函数中考虑释放内存,在拷贝构造函数中考虑内存的分配,内存数据的复制。
(赋值运算符函数)
十一,malloc 和 new 的区别
new 比malloc 多做三件事
1,如果new的类型中有自定义类型,则会自动构建这个自定义类型的成员
2,自动处理类型转换
3,如果使用 new,会调用当应的构造函数,malloc 不会
malloc 申请不会构造
free 和 delete 的区别
delete会调用析构函数 
十二,静态成员
   属于整个类型的函数  而不属于整个对象级别的函数,静态函数不需要通过对象就能调用只要类型就能访问(用对象 也是可以滴)
静态函数没有 this 指针,所以静态函数不能访问非静态的成员。
  静态成员变量的初始化 必须在类外完成。
  静态成员都可以直接通过类名::去调用
十三,成员指针
  指向成员的指针
 a,指向成员变量的指针
  成员变量的类型  类型::*指针名
  struct Date{
 int year;
   int month;
   int day;
};
int Date::*mptr;

给成员指针赋值
mptr = &Date::year;
通过成员指针取得成员的值
Date date;
date.*mptr;
Date *date2 = new Date;
date2->*mptr;

/* 成员指针记录在对象中的偏移量 */

原创粉丝点击