另外const string &与string &两个参数类型可以进行函数重载,其实这就是类const与非const成员函数重载的机制,传入的是const引用(指针)于非const引用(指针)。
编译可通过,执行结果hello world
1
2
3
4
5
6
7
8
9
|
#include<iostream>
#incldue<string>
using
namespace
std;
void
bar(
const
string &str) {
cout<<s<<endl;
}
int
main() {
bar(
"hello word"
);
}
|
编译错误~
1
2
3
4
5
6
7
8
9
|
#include<iostream>
#incldue<string>
using
namespace
std;
void
bar(string &str) {
cout<<s<<endl;
}
int
main() {
bar(
"hello word"
);
}
|
1
2
3
|
int
a[] = {1,2,3};
int
*p = a;
cout<<
"*p++:"
<<*p++<<
" "
<<
"(*p)++:"
<<(*p)++<<endl;
|
(a) new能够自动计算需要分配的内存空间,而malloc需要手工计算字节数。
(b) new与delete直接带具体类型的指针,malloc与free返回void类型的指针。
(c)new是类型安全的,而malloc不是。
(d)new一般由两步构成,分别是new操作和构造。new操作对应于malloc,但new操作可以重载,可以自定义内存分配策略,不做内存分配,甚至分配到非内存设备上,而malloc不行。
(e)new将调用构造函数,而malloc不能;delete将调用析构函数,而free不能。
(f)malloc/free需要库文件stdlib.h支持,new/malloc则不需要库文件支持。
(a)执行return返回语句,计算返回值,暂存在一个临时变量中。
(b)执行finally语句块。
(c)return原来已经计算得到的结果值。
如果finally区段中又调用一次return语句,则try区块返回值将被遮掩,返回的为finally区块中的返回值。
堆,malloc,new分配,free,delete释放。若程序员不释放,程序结束时由系统释放。
栈,编译器自动分配和释放。
全局(静态)存储区:包括DATA段(全局初始化区)与BSS段(全局未初始化区)。BSS段特点,程序执行之前自动清0。所以未初始化的全局变量和静态变量程序执行之前为0。
文字常量区
程序代码区
1
2
3
4
5
6
7
8
9
10
11
|
int
func(
int
x)
{
int
countx = 0;
while
(x)
{
countx++;
x = x&(x-1);
}
return
countx;
}
//函数功能统计x的二进制表示的1的个数
|
常用的等式:
(a)-n = ~(n-1)=~n+1。
(b)获取整数n的二进制的最后一个1:n&(-n)或者n&~(n-1)。
(c)去掉整数n的二进制的最后一个1:n&(n-1)。
方法一:一个一个减,效率较低。
1
2
3
4
5
6
7
8
9
10
11
|
int
div
(
int
a,
int
b) {
int
result = 0;
if
( b == 0) {
return
result;
}
while
( a>=b ) {
result++;
a-=b;
}
return
result;
}
|
方法二:递归法求解,每次将比较数翻倍。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int
div
(
int
a,
int
b) {
int
curres = 0;
int
c = b;
int
res = 0;
if
( b == 0) {
return
res;
}
if
(a < b) {
return
res;
}
for
(;a >= c;c <<= 1,k++) {
if
(a-c < b) {
return
1<<k;
}
}
return
div
(a - (c>>1),b) + (1<<(k-1));
}
|
方法三:采用移位的方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
int
div
(
int
a,
int
b) {
int
left_num = a;
int
res = 0;
while
(left_num >= b) {
int
multi = 1;
while
(b*multi <= (left_num >> 1)) {
multi = multi << 1;
}
res += multi;
left_num -= y*multi;
}
return
res;
}
|
1
2
3
4
5
6
7
|
int
add(
int
num1,
int
num2) {
if
( 0 == num2 )
return
num1;
int
sumT = num1^num2;
int
carry = (num1&num2)<<1;
return
add(sumT,carry);
}
|
int a; int *a; int **a; int a[10]; int *a[10]; int (*a)[10]; int (*a)(int); int (*a[10])(int); int (*a[])(int);(数组a为一个函数指针数组,函数带一个整型变量,并且返回一个整型) int (*p())[10];(函数p返回类型为一个指向一位数组的指针) (*void(*)())0)();(调用地址为0的子程序,函数类型参数和返回值均为void)
复杂的声明解释起来比较有难度,一般出现在笔试题目中。