C++之1|从C到C++

一、从C到C++

1、引用

在讲引用之前,先谈论大家非常熟悉的C语言,然后再由C转入C++。这样不仅可以巩固C知识,而且能够容易理解C++。

例1、数值交换

交换a、b的值

在C语言中实现交换的方法有很多:

  1. 引入另外一个变量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/$ 
  1. 根据两值交换前后不改变相加求和值,所以不用引入第三个变量也可以解决。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/$
  1. 使用逻辑符号异或(^)来实现。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$ 

猜你喜欢

转载自blog.csdn.net/weixin_44035986/article/details/122773110