概述
1、using的使用
1)using声明
》如果出现就近原则,需要避免两个原则同时出现;
2)using编译指令
》如果出现就近原则,优先使用就近原则
》如果有“多个房间打开”,并且存在同名的变量,使用时候需要加作用域区分
namespace kingGlory
{
int sunwukongid = 1;
}
void test01(){
//1、using声明
//要避免就近原则和using同时出现
using kingGlory::sunwukongid;
cout << "sunwukongid = " << sunwukongid << endl;
}
namespace LOL
{
int sunwukongid = 3;
}
void test02()
{
//int sunwukongid = 2;
//2、using编译指令
//如果using编译指令存在多个并且有同名出现,需要加作用域区分 例如kingGlory和LOL
using namespace kingGlory;
using namespace LOL;
//如果有就近原则出现,那么优先选择使用就近原则
cout << "sunwukongid = " << sunwukongid << endl;
}
2、C++对C语言增强
1)全局变量检测的增强 :C不能检测变量重复定义;
//1、全局变量检测增强 C中可以运行,C++会报错
int a;
int a = 10;
2)函数检测增强: C语言对函数有无返回值和有无形参类型、有返回值类型但是函数没有返回数值、调用函数传参个数和函数定义参数个数不同都是没有检测的,都是可以编译通过的,C++中不可以;
3)类型转换检测增强
//malloc(64)返回值void*
//C语言中不需要强转就可以使用
char * p = malloc(64);
//C++语言需要强转才可以编译通过
char * p = (char *)malloc(64);
4)对struct结构体的增强:C++语言下结构体中可以放函数,但C中不可以,C中可以放函数指针,并且在使用上也有优化,C语言下声明结构体的变量的时候必须加struct关键字,C++语言下声明结构体变量的时候可以不加struct;
struct Person
{
int age;
//void func(); C语言下结构体中不可以放函数,C++可以
};
5)bool类型增强:C语言下没有bool类型
6)三目运算符增强:C语言下三目运算符返回的是值,C++语言下三目运算符返回的是变量,
int a = 10;
int b = 20;
//C中报错相当于20=100,C++可行相当于b=100
a > b ? a : b = 100;
7)const
(1)对const修饰变量的修改的区别
1)、
C语言下:
//全局const修饰变量 受到常量区保护,语法通过,运行阶段会报错
const int m_A = 100;
void test07()
{
//m_A = 200;
//int * p = &m_A;
//*p = 200;
const int m_B = 100; //const修饰局部的变量可以间接修改成功
//m_B = 200; //直接修改也是不允许的
int * p2 = &m_B; //间接修改可以
*p2 = 200;
printf("m_B = %dn", m_B);
//int arr[m_B]; //m_B不可以初始化数组
}
//C++中全局const修饰变量和C语言下是一样的,const修饰局部的变量也不可以间接修改(可以运行),因为变量放入到符号表中,实际上修改的是个中间变量
2)、链接属性
//const在C语言下,默认是外部链接属性,不必须手动添加 extern关键字
//const在C++语言下,默认是内部链接属性,必须手动添加 extern关键字 ,提高作用域
extern const int m_A = 10000;
iii、const分配内存的情况
//1、对const修饰的变量取地址时候,会分配临时内存
void test01()
{
const int m_A = 10;
int * p = (int*)&m_A;
}
//2、const前加入 extern 关键字后,也会分配内存
//3、使用 变量 来初始化const修饰的变量
void test02()
{
int a = 10;
const int m_A = a;
int *p = (int *) &m_A;
*p = 20;
cout << m_A << endl;
}
//4、对于自定义数据类型 ,也会分配内存
struct Person
{
string name;
int age;
};
void test03()
{
const Person p;
//不可以直接修改
//p.age = 100;
//p.name = "aaa";
Person * pp = (Person *)&p;
pp->name = "aaa";
pp->age = 10;
cout << "姓名: " << pp->name << " 年龄: " << pp->age << endl;
}
iiii、尽量以const替换#define
const和#define的区别总结:
1、const有类型,可进行编译器类型安全检查,#define无类型,不可进行编译器类型安全检查
2、const有作用域,而#define不重视作用域,默认定义处到文件末尾,如果定义在指定作用域下有效的常量,那么#define就不能用
void func1(){
const int a = 10;
#define A 20
//#undef A //卸载宏常量
}
void func2(){
//cout << "a:" << a << endl;//不可访问,超出了const int a 的作用域
cout << "A:" << A << endl;//#define 作用域从定义到文件结束或者到#undef,都可访问
}
int main(){
func2();
return EXIT_SUCCESS;
}
最后
以上就是漂亮书包为你收集整理的C++学习(二)之using的用法和C++对C语言的增强内容的全部内容,希望文章能够帮你解决C++学习(二)之using的用法和C++对C语言的增强内容所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复