做微信公众号页面的网站,洛阳青峰网络让人去培训,外贸网站推广费用,网站开发后端 书目录
1.命名空间
1.1namespace的价值
1.2namespace的定义
1.3命名空间使⽤
2.C输⼊输出
3.完结散花 个人主页#xff1a;秋风起#xff0c;再归来~ C从入门到起飞 个人格言#xff1a;悟已往之不谏#xff0c;知来者犹可追 克心守己…
目录
1.命名空间
1.1namespace的价值
1.2namespace的定义
1.3命名空间使⽤
2.C输⼊输出
3.完结散花 个人主页秋风起再归来~ C从入门到起飞 个人格言悟已往之不谏知来者犹可追 克心守己律己则安 1.命名空间
1.1namespace的价值
c语⾔项⽬类似下⾯程序这样的命名冲突是普遍存在的问题C引⼊namespace就是为了更好的解决 这样的问题
#includestdio.h
//#includestdlib.hint rand 10;int main()
{printf(%d\n,rand);
}运行时编译没有报错 将头文件stdlib.h放开有报错
#includestdio.h
#includestdlib.h
int rand 10;
int main()
{printf(%d\n,rand);
} 报错的原因就在于当我们将头文件stdlib.h放开在编译预处理阶段编译器会将头文件自动展开而头文件stdlib.h中包含函数rand这时在全局域中就一个全局变量rand并且有一个函数名为rand因此发生命名冲突
在C/C中变量、函数和后⾯要学到的类都是⼤量存在的这些变量、函数和类的名称将都存在于全 局作⽤域中可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化以避免命名 冲突或名字污染namespace关键字的出现就是针对这种问题的。
1.2namespace的定义
• 定义命名空间需要使⽤到namespace关键字后⾯跟命名空间的名字然后接⼀对{}即可{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
namespace Test
{//变量int rand;//函数void func(){return;}//类,后面会讲到class test{public:void Test(){return;}private:int a;int b;};
}
• namespace本质是定义出⼀个域这个域跟全局域各⾃独⽴不同的域可以定义同名变量所以下 ⾯的rand不在冲突了。
• C中域有函数局部域全局域命名空间域类域域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑所有有了域隔离名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑还会影响变量的声明周期命名空间域和类域不影响变量声明周期。
• namespace只能定义在全局当然他还可以嵌套定义。
//命名空间的嵌套定义
namespace Test2
{int a10;namespace Test3{int a 10; }
}
• 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace不会冲突。 • C标准库都放在⼀个叫std(standard)的命名空间中。
开始C语言中命名冲突的问题现在就可以用命名空间来解决了
#includestdlib.h
namespace Test
{int rand 10;
}
int main()
{// 这⾥默认是访问的是全局的rand函数指针(即rand函数返回一个地址)printf(%p\n, rand);// 这⾥指定Test命名空间中的rand后面会讲命名空间的使用printf(%d\n, Test::rand);
} 1.3命名空间使⽤
编译查找⼀个变量的声明/定义时默认只会在局部或者全局查找不会到命名空间⾥⾯去查找。
所以我们要使⽤命名空间中定义的变量/函数有三种⽅式 • 指定命名空间访问项⽬中推荐这种⽅式。 • using将命名空间中某个成员展开项⽬中经常访问的不存在冲突的成员推荐这种⽅式。
namespace Test
{int a 10;int b 20;
}
using Test::a;//a成员被打开int main()
{printf(a%d,b%d\n, a, Test::b);return 0;
} • 展开命名空间中全部成员项⽬不推荐冲突⻛险很⼤⽇常⼩练习程序为了⽅便推荐使⽤。
namespace Test
{int a 10;int b 20;
}
using namespace Test;//打开命名空间的全部成员int main()
{printf(a%d,b%d\n, a, b);return 0;
}2.C输⼊输出
• iostream是Input Output Stream 的缩写是标准的输⼊、输出流库定义了标准的输⼊、输 出对象。
• std::cin 是 istream 类的对象它主要⾯向窄字符narrow characters (of type char)的标准输 ⼊流。
• std::cout 是 ostream 类的对象它主要⾯向窄字符的标准输出流。
• std::endl是⼀个函数流插⼊输出时相当于插⼊⼀个换⾏字符加刷新缓冲区。
• 是流提取运算符。C语⾔还⽤这两个运算符做位运算左移/右移
• 使⽤C输⼊输出更⽅便不需要像printf/scanf输⼊输出时那样需要⼿动指定格式C的输⼊ 输出可以⾃动识别变量类型(本质是通过函数重载实现的这个以后会讲到)其实最重要的是 C的流能更好的⽀持⾃定义类型对象的输⼊输出。
• IO流涉及类和对象运算符重载、继承等很多⾯向对象的知识这些知识我们还没有讲解所以这 ⾥我们只能简单认识⼀下CIO流的⽤法后⾯我们会有专⻔的⼀个章节来细节IO流库。
• cout/cin/endl等都属于C标准库C标准库都放在⼀个叫std(standard)的命名空间中所以要 通过命名空间的使⽤⽅式去⽤他们。
• ⼀般⽇常练习中我们可以using namespace std实际项⽬开发中不建议using namespace std。
• 这⾥我们没有包含stdio.h也可以使⽤printf和scanf在包含间接包含了。vs系列 编译器是这样的其他编译器可能会报错
#includeiostream
using namespace std;//日常小练习和OJ刷题推荐使用大型项目不推荐风险太大int main1()
{int a 10;double b 5.9;char c h;cout a a b b c c endl;//自动识别类型printf(a%d b%0.1lf c%c\n, a, b, c);return 0;
}int main()
{int a 10;double b 5.9;char c h;cin a b c;//可以自动识别类型cout a a b b c c endl;//自动识别类型printf(a%d b%0.1lf c%c\n, a, b, c);return 0;
}
在io需求⽐较⾼的地⽅如部分⼤量输⼊的竞赛题中加上以下3⾏代码, 可以提⾼CIO效率
#includeiostream
using namespace std;
int main()
{// 在io需求⽐较⾼的地⽅如部分⼤量输⼊的竞赛题中加上以下3⾏代码// 可以提⾼CIO效率ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);return 0;
}
3.完结散花
好了这期的分享到这里就结束了~
如果这篇博客对你有帮助的话可以用你们的小手指点一个免费的赞并收藏起来哟~
如果期待博主下期内容的话可以点点关注避免找不到我了呢~
我们下期不见不散~~