C++学习日记day03

原创 2012年03月22日 21:02:58
第三课
1. 初始化表的必要性
1) 类中包含常量和引用型的成员变量。必须通过构造函数和初始化表显式地对其进行初始化。
2) 在子类中显式地构造其基类部分。
class A {
public:
    A (void) {}
    A (int n) : m_n (n) {}
private:
    int m_n;
};
class B {
pulbic:
    B (void){}
    B (int n) : m_a (n) {}
private:
    A m_a;
};
2. 支持自定义类型转换的构造函数
在目标类型中定义如下形式的构造函数:
目标类::目标类 (const 源类& 源类引用) {...}
可以实现从源类到目标类的隐式类型转换。
通过使用explicit关键字可以指示该构造函数只能用于显式类型转换,以防止潜在的错误。
3. this指针
class A {
    void foo (B b) {...}
};
class B {};
A a;
B b;
a.foo (b);
a:调用对象;
b:参数对象。
1) 一般而言,关键字this表示一个指针,对于一般成员函数,该指针指向调用对象,而对于构造函数,它指向这个正在构造的对象。
2) this指针可用于在构造函数中区分与构造参数名相同的成员变量。
3) this指针可以用于返回自引用的场合。
4) this指针可以作为函数的参数实现对象间交互。
4. const对象和const成员函数
const char*
char* const
1) 常量型成员函数中的this指针为常量型,以此防止对成员变量的意外修改。
2) 通过常量类型的对象、引用或者指针,只能访问其常量类型的成员函数,否则将引发编译错误。
3) 被声明为mutable的成员变量可以在常量型成员函数中被修改。
4) 常量型成员函数与非常量型成员函数构成重载关系。
5) 通过常量型对象、引用或者指针只能调用常量型成员函数,而通过非常量型对象、引用或者指针优先调用非常量型成员函数。
const int n = 10;
void foo (const int& n) {...}
const char* foo (void) {...}
void A::foo (void) const {...}
5. 析构函数
1) 基本语法
class 类名 {
   ~类名 (void) {
       析构函数体;
   }
};
特征:没有参数,不能重载。
2) 缺省析构函数
A. 对于未定义析构函数的类,系统会提供一个缺省析构函数,该析构函数会调用成员及其基类的析构函数。
B. 缺省析构函数不负责释放动态分配的资源。
3) 对于动态分配的资源,必须通过自己定义的析构函数进行释放。
4) 析构函数所释放的资源不仅限于内存资源,还包括文件、socket、信号量等等。
练习:实现一个整型数组类IntArray
通过构造函数指定容量,注意析构释放资源。
push()在数组的尾部加入一个元素;
pop()从数组的尾部弹出一个元素;
get()根据下标获取一个元素的值;
set()根据下标设置一个元素的值;
print()打印数组。
提示:内部维护一个整型数组,动态分配,还要维护一个数组上限。
10 20 30 40
-------------------
0  1  2  3  top = 4
6. 拷贝构造函数和拷贝赋值运算符
A a1;
A a2 (a1);
A a2 = a1;
A* pa2 = new A (a1);
1) 缺省方式的拷贝构造函数就是按字节复制一份和拷贝源一模一样的副本。
2) 自定义拷贝构造函数:
class 类名 {
    类名 (const 类名& obj) {
        以拷贝的方式从obj复制成员变量的值;   
    }
};
3) 缺省方式的字节复制往往不能实现对象间的深拷贝,这时就需要提供自己定义的拷贝构造函数,以获得真正意义上的副本。
4) 拷贝构造的时机
A. 用同类型的对象做初始化;
B. 函数调用传递对象型参数;
C. 函数返回对象(受编译优化的影响)。
5) 拷贝构造只能解决构造对象副本时的深拷贝问题,缺省方式的拷贝赋值仍然是按字节复制,这种情况下就需要提供一个自定义的拷贝赋值运算符函数,以获得真正意义上的对象副本。
class 类名 {
    类名& operator= (const 类名& obj) {
        以拷贝的方式从obj复制成员变量的值;   
    }
};
注意:A. 先释放已有的资源然后再从拷贝源复制资源。
      B. 防止自赋值。
      C. 返回自引用,以支持连续赋值。
7. 静态成员
static
1) 静态成员是属于类的,非静态成员是属于对象的。可以在所有的该类的对象间共享。
2) 既可以通过对象也可以通过类访问静态成员。
3) 静态成员函数只能访问静态成员,不能访问非静态的成员。非静态成员函数既可以访问非静态成员,也可以访问静态成员。
4) 静态成员变量必须在类的外部定义并初始化。
5) 静态成员函数没有this指针。
6) 静态成员同样受访问控制的约束。

C++学习日记和心得(一)(新手帖,高手勿笑)

我之前三年也学过其他语言,
  • u011004567
  • u011004567
  • 2014年07月11日 14:58
  • 427

学习日记-html5

已掌握:学习并使用过HTML, CSS, 但并不熟练,特别是css常用效果了解但对于不常用的能实现的效果不清晰,html的各种标签除常用部分,其他在使用时需要去查询. 今日学习:html5 发展,与...
  • trch1989
  • trch1989
  • 2017年02月06日 16:50
  • 177

linux学习日记!!

一,用户的理解 在系统中用户储存为若干字符串+若干个系统配置文件 联系到的配置文件: /etc/passwd        用户信息 /etc/shadow        用户认证信息 /e...
  • SjmMx1314aini
  • SjmMx1314aini
  • 2017年02月13日 00:04
  • 138

2016年寒假学习日记

svn配置管理 mock server 创建测试服务 junit测试 eclipse 插件开发 osgi框架 java bean和oracle type:公司实现,type编程http://blog....
  • xdyzyh
  • xdyzyh
  • 2017年02月20日 21:12
  • 167

c++ primer学习 day03

1.迭代器---是一种检查容易内元素并遍历元素的数据类型。 2.每种容器类型都定义了自己的迭代器类型,如vector:vector::iterator iter; 3.const_itreator对象...
  • qianlongbatian2
  • qianlongbatian2
  • 2013年09月26日 13:30
  • 331

计算机系统学习笔记<一>

计算机是由硬件软件组成的, 硬件相当于肉体而软件相当于灵魂,两者是相辅相成的。软件分为系统软件和应用软件他们和硬件的关系是应用软件位于最外层,中心是硬件,系统软件位于两者中间。   系统软件有很多种...
  • yqoneyear
  • yqoneyear
  • 2017年03月19日 20:01
  • 246

菜鸟shell 脚本学习日记

1、shell 脚本统计当前目录下指定后缀文件行数: 获取当前目录下所有后缀为.txt 文件行数,包含空白行(包括子目录): $find . -name "*.sh" |xargs cat |wc -...
  • cxj415
  • cxj415
  • 2017年11月29日 23:10
  • 52

今天写了第一个java类

终于今天真的写Java代码了。写了三个类,用ksh调用的。不过基本就是抄,嘿嘿。。。在已有的project下新建package,新建class。把从别处copy来的代码改了改,很容易编译就过了。IDE...
  • OnlyQi
  • OnlyQi
  • 2011年04月23日 09:54
  • 519

javascript学习日记——(1)

1.1    Javascript诞生于1995年。它的主要目的是处理以前由服务器语言(如Perl)负责的一些输入验证操作。 1.2    Javascript虽然和ECMAScript通常都被人...
  • a273944127
  • a273944127
  • 2017年07月01日 16:41
  • 111

闭关日记 Day03

这篇日记晚了写了,赶进度和开会把时间用得一干二净。以后没时间也先挖个坑,但是比较好的是我在手机的记事本里面,零零散散写了一些记录。整理一下,也不算过时回忆不起来了。     阴天,可以骑着电动车去驾...
  • u013157684
  • u013157684
  • 2016年03月17日 01:06
  • 223
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++学习日记day03
举报原因:
原因补充:

(最多只允许输入30个字)