c学习之旅:从c语言到c
c++概述
1:c++两大编程思想
2.面向对象
3.泛型编程
4.移植和标准
c++初始
1.引入头文件 #include<iostream>标准输入输出流
2.使用标准命名空间 using namespace std;
3.标准输出对象 cout<<":"<<1234<<3.15<<endl;
4面向对象的三大特性:封装。继承。多态
#include<iostream>
using namespace std;
int a = 1000;//全局变量
int main()
{
int a = 100;//局部变量
cout << "a" << a << endl;//endl是换行
}
这个程序用来打印a,我们在c语言里面学过当全局变量和局部变量同名的时候我我们打印的时候优先打印局部变量,也可以理解为就近原则。所以这个程序的运行结果为100
结果:
但是如果我们要想输出全局变量又该如何输出了。c++中引入了::运算符
#include<iostream>
using namespace std;
int a = 1000;//全局变量
int main()
{
int a = 100;//局部变量
cout << "a:" << a << endl;//endl是换行
cout << "a:" << ::a << endl;//::表示做用域,如果前面什么都不加,代表全局作用域
}
运行结果:
::表示的是作用域如果什么都不加代表全局作用域。如果加了则代表在哪个东西下的东西
1.命名空间的用途:解决名称冲突
2.命名空间下可以存放:变量,函数,结构体,类等
3.命名空间必须声明在全局作用域
4.命名空间是可以嵌套命名空间
5.命名空间是开放的,可以随时随地将成员添加到命名空间下
6.命名空间是可以匿名的
7.命名空间可以起别名
8 .using 声明
10.当using 编译指令与就近原则同时出现,优先使用就近
11.当using编译指令有多个,需要加作用域区分
1.对全局变量的检测增强
#include<stdio.h>
int a;
int a = 10;
int main()
{
return 0;
}
在.c中没有检测出来
而在.cpp中
这说明c++对全局变量的检测增强
2.对函数检测增强 返回值没有检测 形参类型没有检测 函数调用参数个数没有检测
#include<stdio.h>
test(int a, int b)
{
return a * b;
}
int main()
{
printf("%d", test(2, 3, 5));
return 0;
}
运行结果
而在.cpp中
3.类型检测增强
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = malloc(4);
return 0;
}
在malloc这个函数返回的是void 而此时我们用int的指针去接收没有报错虽然类型不兼容
但是在.cpp中直接报错
4.struct增强
在c语言中结构体中不允许有函数,在创建结构体变量的时候必须加关键字struct
例子:
#include<stdio.h>
#include<stdlib.h>
struct people
{
int a;
void func()
{
printf("hehe");
}
};
int main()
{
people t;
t.a = 10;
return 0;
}
直接报错了
而在.cpp中
生成成功:在c++中允许这样
5.新增数据类型bool
bool类型代表真和假 ture代表真(1)false代表假(0)。会将非0的数转成1。大小为1
例:
#include<iostream>
using namespace std;
int main()
{
bool a = -10;
cout << a << endl;
}
运行结果:
#include<iostream>
using namespace std;
int main()
{
cout << sizeof(bool);
}
运行结果:
6.三目操作符增强
在C语言中的三目操作符(?:)返回的是值只能充当右值而c++中返回的是一个引用,对引用进行赋值是允许的
例在.c中
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int ret = (a > b ? a : b) = 100;
printf("%d", ret);
}
而在c++中返回的是变量
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int ret = (a > b ? a : b) = 100;
printf("%d\n", ret);
printf("%d", b);
}
结果:
7.对const 增强
1.在C语言中const是真的意义上的的常量吗?答案是不是。在c语言中const 仅仅是从编译层来限定,不允许对const修饰的变量进行修改,而在运行期间是无效的,所以并非是真正的常量。可以通过指针进行修改.举个例子:
#include<stdio.h>
int main()
{
const int a=10;
int *p=&a;
*p=20;
printf("%d",a);
}
在c语言编译器下:运行的结果为:20
我们发现在c语言中我们通过指针可以修改const修饰的变量。但在c中const就有区别,在c中编译时会把const常量加入到符号表中,以后(任然在编译期)遇到这个变量会从符号表中查找,所以在c++中是不可以修改const修饰的变量的.
下面通过一段代码来看看区别:
在c++中:
#include<stdio.h>
int main()
{
const int a = 10;
int* p =(int *) &a;
*p = 20;
printf("%d %d", a,*p);
}
运行结果为 10,20;
而在c语言中:
(补充)在c++中const修饰的全局变量默认是内部链接属性。
1:什么是变量:变量名实质上是一段连续存储的空间的别名,就类似于门牌号。程序通过变量来申请并命名内存空间。通过变量的名字来使用存储空间
一段连续的内存空间只能取一个别名吗?
2.引用的的概念
1.引用可以看作是变量的别名
2引用的基本语法:类型名 &别名=原名
例:
#include<iostream>
using namespace std;
int main()
{
int a=10;
int &b=a;
b=100;
cout<<a<<endl;
cout<<b<<endl;
}
运行结果:
这就很类似于c语言的指针,简接修改变量。
3.普通引用必须要初始化
#include<stdio.h>
int main()
{
int & b;
}
此时编译器已经报错这说明普通引用必须要初始化
普通引用不能用常量初始化
4.引用有什么用
在c语言的学习过程中相信大家都对swap这个例子很熟悉
#include<iostream>
using namespace std;
void swap(int a,int b)
{
int tmp=a;
a=b;
b=tmp;
}
int main()
{
int a=10;
int b=89;
swap(a,b);
cout<<a<<endl;
cout<<b<<endl;
}
执行完swap函数之后变量a和变量b的值并没有发生改变。这是因为形参是实参的一份临时拷贝,发生的是值拷贝。形参的改变不会影响实参。所以a和b没有发生改变,在c语言中我们可以通过指针来交换a,b的值。但在这里我们可以通过引用来交换a,b.
#include<iostream>
using namespace std;
void swap(int &a,int& b)
{
int tmp=a;
a=b;
b=tmp;
}
int main()
{
int a=10;
int b=89;
swap(a,b);
cout<<a<<endl;
cout<<b<<endl;
}
运行结果:
5.常引用
常引用是让变量引用只读属性。不能通过别名去修改实名。
常引用的初始化:1.使用变量初始化。2.使用常量初始化
#include<iostream>
using namespace std;
int main()
{
int a=0;
const int &b=a;
const int &i=9;
}
6.引用的本质:引用的本质是一个常量指针:type&name<->type*const name.
7:引用是否分配内存
引用分配内存,而且占用内存和指针一样因为引用的内部实现就是通过指针来完成的就好像如
type &name ;<->type*const name.
8.指针和引用的区别
相同点:
1。都是地址的概念
2.都指向了一块内存空间,他的内容是所指内存的地址,引用则是某块内存的别名
3.引用在内部实现其实是借助指针实现的,一些场合可以用来代替指针,比如做函数参数
不同点
1.指针是一个实体,而引用(看起来)仅仅是个别名
2.引用只能初始化一次,之后就不可以改变,就类似于情有独钟,而指针可以改变:引用一生一世,从一而终。而指针却可以见异思迁
3.指针可以不初始化但引用必须初始化
4.引用不能为空,而指针可以为空
5.sizeof(引用)得到的是所指向变量(对象)的大小,而sizeof(指针)得到的是指针本身的大小
6,指针和引用的自增(++)运算意义不一样
7。引用是类型安全的,而指针不是(引用比指针多了类型检查)
8。引用具有更好的可读性和实用性
如有错误请在评论区留言:
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_56999918/article/details/119747949
内容来源于网络,如有侵权,请联系作者删除!