C++学习
- 一、从C到C++
- 1、引用
- 例1、数值交换
- 例2、数值交换优化版
- 例3、数值交换C++版
- 2、函数重载
- 例4、数值/字符串比较
- 3、堆内存分配(new/delete)
- 例5-1、C语言中的内存分配(malloc/free)
- 例5-2、C++中的内存分配(new/delete)
- 4、设置默认参数
- 例6、普通调试程序的函数
一、从C到C++
1、引用
在讲引用之前,先谈论大家非常熟悉的C语言,然后再由C转入C++。这样不仅可以巩固C知识,而且能够容易理解C++。
例1、数值交换
交换a、b的值
在C语言中实现交换的方法有很多:
- 引入另外一个变量c作为中介,先把a的值赋给c(c=a),然后把b的值给a(a=b),最后把c中的a的值取回放到b那里(b=c),从而实现转换。
#include <stdio.h>
int main()
{
int a = 100;
int b = 10;
int c;
printf("a = %d, b = %d\n", a, b);
c=a;
a=b;
b=c;
printf("a = %d, b = %d\n", a, b);
}
结果:
@ubuntu:/mnt/hgfs/ub2/$ gcc swap1.c
@ubuntu:/mnt/hgfs/ub2/$ ./a.out
a = 100, b = 10
a = 10, b = 100
@ubuntu:/mnt/hgfs/ub2/$
- 根据两值交换前后不改变相加求和值,所以不用引入第三个变量也可以解决。b=a+b,a=b-a(相当于a=a+b-a最终a得到b的值),b=b-a(相当于b=a+b-b)
#include <stdio.h>
int main()
{
int a = 100;
int b = 10;
printf("a = %d, b = %d\n", a, b);
b=a+b;
a=b-a;
b=b-a;
printf("a = %d, b = %d\n", a, b);
}
结果:
@ubuntu:/mnt/hgfs/ub2/$ gcc swap2.c
@ubuntu:/mnt/hgfs/ub2/$ ./a.out
a = 100, b = 10
a = 10, b = 100
@ubuntu:/mnt/hgfs/ub2/$
- 使用逻辑符号异或(^)来实现。a^=b,b^=a,a^=b。
#include <stdio.h>
int main()
{
int a = 100;
int b = 10;
printf("a = %d, b = %d\n", a, b);
a^=b;
b^=a;
a^=b;
printf("a = %d, b = %d\n", a, b);
}
结果:
@ubuntu:/mnt/hgfs/ub2/$ gcc swap3.c
@ubuntu:/mnt/hgfs/ub2/$ ./a.out
a = 100, b = 10
a = 10, b = 100
@ubuntu:/mnt/hgfs/ub2/$
为了显得高档一点,封装成函数
例2、数值交换优化版
#include <stdio.h>
void swap(int *p, int *q)
{
*p ^= *q;
*q ^= *p;
*p ^= *q;
}
int main()
{
int a = 100;
int b = 10;
printf("a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("a = %d, b = %d\n", a, b);
}
结果:
@ubuntu:/mnt/hgfs/ub2/$ gcc swap4.c
@ubuntu:/mnt/hgfs/ub2/$ ./a.out
a = 100, b = 10
a = 10, b = 100
@ubuntu:/mnt/hgfs/ub2/$
这里是特别经典的函数封装,要用到指针才正确。如果不用指针的话就需要进行值的返回,否则swap()形同虚设,并没有进行值的交换,如下所示:
#include <stdio.h>
void swap(int p, int q)
{
p ^= q;
q ^= p;
p ^= q;
}
int main()
{
int a = 100;
int b = 10;
printf("a = %d, b = %d\n", a, b);
swap(a, b);
printf("a = %d, b = %d\n", a, b);
}
结果:
@ubuntu:/mnt/hgfs/ub2/$ gcc swap4.c
@ubuntu:/mnt/hgfs/ub2/$ ./a.out
a = 100, b = 10
a = 100, b = 10
@ubuntu:/mnt/hgfs/ub2/$
swap()函数退出后没有值返回,所以a和b不会交换。面试会考这个。
例3、数值交换C++版
#include <stdio.h>
int swap(int &a, int &b)
{
a ^= b;
b ^= a;
a ^= b;
}
int main()
{
int a = 100;
int b = 10;
printf("a = %d, b = %d\n", a, b);
swap(a, b);
printf("a = %d, b = %d\n", a, b);
}
相比上述的C语言方式,此处的表达更加直观,思路不用去跟指针以及取地址较劲。
int swap(int &a, int &b)这里的int &a和int &b就是引用。&是引用的意思,不是C语言的取地址。比如int a=100,int &b=a,这里就是b引用了a。不仅仅是值的传递,而且地址一致。
#include <stdio.h>
int main()
{
int a =100;
int &b = a;
printf("a = %d, b = %d\n", a, b);
printf("addr: a = %p, b = %p\n", &a, &b);
}
@ubuntu:/mnt/hgfs/ub2/$ g++ test.cpp
@ubuntu:/mnt/hgfs/ub2/$ ./a.out
a = 100, b = 100
addr: a = 0xbfb02ae8, b = 0xbfb02ae8
@ubuntu:/mnt/hgfs/ub2/$
2、函数重载
例4、数值/字符串比较
这个很简单,直接返回两数的差值即可得出数值的大小比较,字符串大小比较的话可以使用库函数的strcmp()
(使用字符串函数时要加头文件string.h),相信大家都会。
#include <stdio.h>
#include <string.h>
int intcmp(int a, int b)
{
return a-b;
}
int scmp(const char *str1, const char *str2)
{
return strcmp(str1, str2);
}
int main()
{
printf("%d\n", intcmp(1, 2));
printf("%d\n", scmp("aaaaaa", "bbbb"));
}
这里就有个点不知道是否引起大家注意:数值比较和字符串比较都同样是比较功能,却需要不同的函数来实现。能否使用一个函数就可以呢?是的,在C++里函数重载就可以解决这个问题。
#include <stdio.h>
#include <string.h>
int cmp(int a, int b)
{
return a-b;
}
int cmp(const char *str1, const char *str2)
{
return strcmp(str1, str2);
}
int main()
{
printf("%d\n", cmp(1, 2));
printf("%d\n", cmp("aaaaaa", "bbbb"));
}
重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。
3、堆内存分配(new/delete)
例5-1、C语言中的内存分配(malloc/free)
#include <stdio.h>
#include <malloc.h>
#include <string.h>
int main()
{
int *intp = (int*)malloc(sizeof(int));
*intp = 100;
printf("*intp = %d\n", *intp);
free(intp);
char *p = (char *)malloc(10);
strcpy(p, "hello");
printf("p: %s\n", p);
free(p);
}
例5-2、C++中的内存分配(new/delete)
#include <stdio.h>
#include <malloc.h>
#include <string.h>
int main()
{
int *intp = new int;//(int*)malloc(sizeof(int));
*intp = 100;
printf("*intp = %d\n", *intp);
delete intp;
char *p = new char[10];
strcpy(p, "hello");
printf("p: %s\n", p);
delete [] p;
}
4、设置默认参数
例6、普通调试程序的函数
想查看程序执行的位置经常使用字符串打印“------------”进行位置确定,但偶尔有些时候想进行标注,比如说打印个日期、解释等字符串。所以就想把常用的“-----------”设置为默认,其它偶尔情况的再去单独标注。
#include <stdio.h>
void debug(const char *ptr = "---------------")
{
printf("%s\n", ptr);
}
int main()
{
debug();
debug();
debug("hello");
debug();
debug();
debug();
debug("world");
debug();
}
结果:
@ubuntu:/mnt/hgfs/ub2$ g++ debug.cpp
@ubuntu:/mnt/hgfs/ub2$ ./a.out
---------------
---------------
hello
---------------
---------------
world
---------------
@ubuntu:/mnt/hgfs/ub2$