一、default constructor---默认构造函数,亦即无参构造函数。从对象构造语义上讲,可分为以下2种:1)trivial 平凡的,可以理解为浅构造 2)notrivial 非平凡的,可以理解为深构造。当一个class没有显式地(explicitly)声明或定义任何constructor的时候,一个default constructor就会被编译器隐式地(implicitly)声明或定义出来。那么这个implicitly default constructor到底是trivial还是notrivial的呢?对于一个class,当存在以下4种情况时,其implicitly default constructor就是notrivial的。
(1)class内含一个或多个成员对象(member object),且这些member object中至少一个存在default constructor(无论是显式的default constructor还是隐式的notrival default constructor)
(2)class派生自一个继承串链,其中至少有一个base class存在default constructor(再次强调,无论是显式的default constructor还是隐式的notrival default constructor)
(3)class声明一个或多个虚函数(virtual function)
(4)class派生自一个继承串链,其中至少有一个虚基类(virtual base class),而不管这些virtual base class是否存在default constructor
显而易见,这4种情况是正交的,当不存在以上4种情况时,其implicitly default constructor就是trivial的。只有notrivial的default constructor才会被编译器真正生成,而trivial的不会生成。
二、copy constructor---拷贝构造函数,亦即带有当且仅有一个参数,类型为同类对象的构造函数。从对象拷贝语义上讲,可分为以下2种:1)bitwise copy 位拷贝,可以理解为浅拷贝 2)no bitwise copy 非位拷凡,可以理解为深拷贝。当一个class没有显式地声明或定义copy constructor时,一个copy constructor就会被编译器隐式地声明或定义出来。那么这个implicitly copy constructor到底是bitwise copy还是no bitwise copy的呢?对于一个class,当存在以下4种情况时,其implicitly copy constructor就是no bitwise copy的。
(1)class内含一个或多个成员对象,且这些member object中至少一个存在copy constructor(无论是显式的copy constructor还是隐式的no bitwise copy constructor)
(2)class派生自一个继承串链,其中至少有一个base class存在copy constructor(再次强调,无论是显式的copy constructor还是隐式的no bitwise copy constructor)
(3)class声明一个或多个虚函数
(4)class派生自一个继承串链,其中至少有一个虚基类,而不管这些virtual base class是否存在copy constructor
显而易见,这4种情况是正交的,当不存在以上4种情况时,其implicitly copy constructor就是bitwise copy的。只有no bitwise copy的copy constructor才会被编译器真正生成,而bitwise copy的不会生成。
三、对于defualt constructor,当一个class内显式地存在constructor(包括default constructor)时,编译器不会再生成它,但如果这个class满足以上4种情况至少一种时,编译器就需要负责执行相关的初始化:对于(1)要调用成员对象的default constructor;对于(2)要调用基类的default constructor;对于(3)要设定虚函数表的指针;对于(4)要设定虚基类的指针和偏移量。而这些初始化在用户代码执行前。
四、对于copy constructor,当一个class内显式地存在copy constructor时,编译器不会再生成它,但如果这个class满足以上情况(3)或(和)(4)时,编译器就需要负责执行相关的拷贝:对于(3)要决定怎么设定虚函数表指针。对于(4)要决定怎么设定虚基类的指针和偏移量。同理类推,如果这个class满足情况(1)或(和)(2),而且其成员对象或基类子对象又满足情况(3)或(和)(4)时,编译器也需要负责执行相关的拷贝了。而这些拷贝在用户代码执行前。
posted @
2011-08-31 11:40 春秋十二月 阅读(4984) |
评论 (0) |
编辑 收藏
摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1/***************************************************************************************&...
阅读全文
posted @
2011-08-27 15:12 春秋十二月 阅读(2668) |
评论 (0) |
编辑 收藏
摘要: 类型定义 在多叉树中,叶子遍历迭代器有只读、读写、只读反转、读写反转4种,在mtree容器中的定义如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1 &nb...
阅读全文
posted @
2011-08-25 10:35 春秋十二月 阅读(2229) |
评论 (0) |
编辑 收藏
摘要: 类型定义 在多叉树中,兄弟遍历迭代器有只读、读写、只读反转、读写反转4种,在mtree容器中的定义如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1  ...
阅读全文
posted @
2011-08-20 21:06 春秋十二月 阅读(1758) |
评论 (0) |
编辑 收藏
方法1:使用find和xargs命令
find dir | xargs grep str,dir是指某个目录
find file | xargs grep str,file是指某个文件
注意:这种方法,会递归搜索子目录
方法2:直接使用grep命令
grep str dir/*,dir是指某个目录,但不递归搜索其子目录
grep -r str dir/*,使用-r选项,递归搜索其子目录
grep str file,file是指某个文件
方法3:综合以上两种,写一个shell脚本,代码如下
1
#! /bin/bash
2
# findstr.sh
3
4
if [ $# -lt "2" ]; then
5
echo "Usage: `basename $0` path name [option]"
6
exit 1
7
fi
8
9
path=$1
10
name=$2
11
shift
12
shift
13
14
for option in "$@"
15
do
16
case $option in
17
-r) dir_op="-r"
18
;;
19
-i) lu_op="-i"
20
;;
21
*) if [ -n "$option" ]; then
22
echo "invalid option"
23
exit 1
24
fi
25
;;
26
esac
27
done
28
29
grep_str_of_file()
30
{
31
file=$1
32
str=$2
33
out=$(grep -n $lu_op "$str" "$file")
34
if [ -n "$out" -a "$file" != "$0" ]; then
35
echo "$file: $out"
36
fi
37
}
38
39
find_str()
40
{
41
if [ -d "$1" ]; then
42
for file in $1/*
43
do
44
if [ "$dir_op" = "-r" -a -d "$file" ]; then
45
find_str $file $2
46
elif [ -f "$file" ]; then
47
grep_str_of_file $file $2
48
fi
49
done
50
elif [ -f "$1" ]; then
51
grep_str_of_file $1 $2
52
fi
53
}
54
55
find_str $path $name
这样一来,不管$1参数是目录还是文件,都能处理,使用示例如下:
findstr /usr/include main 不递归搜索子目录,大小写敏感
findstr /usr/include main -i 不递归搜索子目录,忽略大小写
findstr /usr/include main -r 递归搜索子目录,大小写敏感
findstr /usr/include main -r -i 递归搜索子目录,忽略大小写
findstr main.cpp main 在文件中搜索,大小写敏感
findstr main.cpp main -i 在文件中搜索,忽略大小写
上面所述的示例中,str不限于特定的文本,可以是带正则表达式的匹配模式。而第3种方法,也可以用sed替换grep来显示文本行,在此基础上能作更多的处理,比如格式化显示、统计匹配的文本个数、搜索策略等,在此就不详究了。
posted @
2011-08-20 19:46 春秋十二月 阅读(2509) |
评论 (0) |
编辑 收藏
摘要: 类型定义 在多叉树中,后序遍历迭代器有只读、读写、只读反转、读写反转4种,在mtree容器中的定义如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->1 &nb...
阅读全文
posted @
2011-08-15 12:51 春秋十二月 阅读(1954) |
评论 (2) |
编辑 收藏
摘要: 类型定义
在多叉树中,前序遍历迭代器有只读、读写、只读反转、读写反转4种,在mtree容器中的定义如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->1 &n...
阅读全文
posted @
2011-08-14 13:30 春秋十二月 阅读(2806) |
评论 (0) |
编辑 收藏
摘要: 迭代器的分类与框架
迭代器是一种设计模式,用来访问容器对象的内容而无须暴露容器的内部实现,而多叉树是一种具有递归性质的复合对象,因此它的迭代器是一种复合迭代器,且存在多种遍历顺序和策略,如前序、后序、广度、叶子、兄弟等,为了支持实现这种复合迭代器,就需要设计不同的迭代器类,由于迭代器封装了对多叉树的访问,而这种访问又可分为只读和读写两类,它们在stl中的实现就...
阅读全文
posted @
2011-07-31 07:55 春秋十二月 阅读(2759) |
评论 (0) |
编辑 收藏
摘要: 在面向对象开发时,对实际问题分析进而抽象出一种类型,往往会考虑到2个方面:1)类型的内部成员和方法的定义描述 2)类型的多实例存取操作。其中第1点是类型本身数据结构的设计,第2点是类型容器数据结构的选择设计。在stl中,容器有序列式和关联式两种,前者代表有vector,list,deque等;后者代表有set,multiset,map,multimap等,对于一...
阅读全文
posted @
2011-07-16 12:23 春秋十二月 阅读(1925) |
评论 (0) |
编辑 收藏
摘要: 需求分析
在数据结构中,树有两种存储方式,一种是链式存储,另一种是顺序存储。前者就是使用指针来记录树结点间的关系,在新增结点或删除结点时,只需改变与父结点或兄弟结点的指针值即可,实现较为简单;后者就是使用数组来存储,可以用相对偏移量来记录树结点间的关系,在新增结点或删除结点时,则不仅是改变与父结点或兄弟结点的相对偏移量,还需要改变其它结点的相对偏移量,实现较为...
阅读全文
posted @
2011-07-13 15:10 春秋十二月 阅读(4699) |
评论 (9) |
编辑 收藏