营销推广计划怎么写,汕头seo网络推广,如何在天气预报网站做引流,做视频的软件模板下载网站有哪些内容进入C以后#xff0c;就翻开了新的篇章。C支持C语言的使用。事实上#xff0c;C是创建者在发现C语言中有很多不好用的地方#xff08;在后续学习中会明显看到#xff09;后#xff0c;在C语言基础上又加入了许多语法#xff0c;于是就成了C。
1.命名空间
来源#xff…进入C以后就翻开了新的篇章。C支持C语言的使用。事实上C是创建者在发现C语言中有很多不好用的地方在后续学习中会明显看到后在C语言基础上又加入了许多语法于是就成了C。
1.命名空间
来源在C语言中同一个作用域内可能会发生命名重复命名冲突的问题。如果代码量一多那么命名冲突很难避免。在C中就增加了命名空间。
定义namespace 空间的名字 。空间名字是自定义的。比如zhangsan。
namespace zhangsan
{int rand 0;int add(int a, int b){return ab;}struct STNode{int val;STNode* next;};
}
这样就把自己定义的函数变量结构体限定在这个命名空间内。那么别人就不能随意访问了。除了定义变量、函数和结构体外命名空间也可以嵌套。 命名空间的访问
1.空间名成员名。 这个符号是作用域限定符。
int main ( )
{int a zhangsan::rand;return 0;
}
2.用using 将命名空间的某个成员引入。个人理解这相当于把这个空间内的成员声明在想使用的地方了。
using zhangsan::rand;
int main()
{int a rand;return 0;
}
3.using namespace 空间名。和2有点相似上面展开的只是某个成员现在展开的是这个空间了。
using namespace zhangsan;
int main()
{int a rand;add(2,3)struct STNode s1;return 0;
}
如上图所示此时在main函数中就可以不加限定范围操作符而使用命名空间中的各种成员了。 2.C输入和输出
#include iostream
using namespace std;int main()
{couthelloendl;return 0;
}
注意
a.使用cout 标准输出对象控制台和cin标准输入对象键盘时必须包含头文件iostream以及按照命名空间使用方法 使用std。
b.cout 和cin 是全局的流对象endl是特殊的C符号表示换行输出。他们都包含在iostream头文件中。
c.是流插入是流提取。
d.C的输入输出可以自动识别变量类型而不需要手动添加占位符。
cout和cin分别是ostream和istream的对象 和也涉及运算符重载。此处不做扩展。
早期标准库基本都在全局域中实现想要用的时候加上对应的.h头文件就可以。为了和C语言进行区分C的头文件不再加.h后缀。因此推荐使用iostream和std的方式。
std是C标准库的命名空间名字C将标准库的定义实现都放在这个命名空间中。如果只在某个区域内使用不必要在全局用以免自己命名和函数名相撞产生命名冲突这种问题。只需要展开常用的头文件就可以了。
#include iostreamint main()
{using std::cout;couthehe endl;return 0;
}
3.缺省参数
缺省参数是声明或者定义函数时给参数一个缺省值在调用这个函数时如果没给实参就用默认的缺省值如果给了实参就用实参。
void func(int i 10)
{coutiendl;
}
int main()
{func();func(2);return 0;
}
缺省参数分为全缺省和半缺省。
a.全缺省就是每一个形参都给了缺省值。
b.半缺省是部分没给。但需要注意的是半缺省只能从右往左给值中间不能隔几个不给的。
c.缺省参数不能在声明和定义同时出现同时出现而缺省值给的不同编译器就不知道给哪个值了所以不能同时出现。
d.缺省值必须是常量。
e.C语言不支持。
4.函数重载
C允许在同一作用域中声明几个功能相似的同名函数。这些函数由于形参的不同类型不同类型的顺序不同个数不同而能够同时使用。就是构成了函数重载。这些不同不包括返回类型不同。
为什么C支持函数重载C语言不支持
一个程序要运行起来需要经过预处理、编译、汇编、链接四个阶段。
链接的时候面对一个函数C语言中链接器会用函数名去找这个函数。
C不一样每个编译器都有自己的函数名修饰规则在gcc中是Z函数名长度函数名形参类型的首字母。所以由于函数形参不一样而找到对应的函数不会找错和搞混。
C语言没办法支持重载因为它只能通过函数名去找没法区分。C是通过函数修饰规则区分参数不同修饰的名字就不一样所以能够支持重载。
5.引用
引用不是新定义了一个变量而是给变量取了个别名它和被引用的变量共用一块空间。只是把原来的变量换了一种叫法。
void func ( )
{int a 10;int b a;couta bendl;couta bendl;
}
引用特性
1.引用在定义时必须初始化
2.一个变量可以有多个引用
3.引用一旦引用一个实体再不能引用其他实体
使用须知
1.引用可以权限缩小但不能权限放大。
比如被引用的变量是int可以定义一个常属性的变量来引用。
但是当被引用的是常量就不能定义一个变量来引用它了。
2.做参数
void swap(int a, int b)
{int tmp a;a b;b tmp;
}
3.做返回值
下面这种写法是错的。因为b的范围只在作用域内。出了作用域空间被销毁b的值就是随机的了。而返回值是b的引用所以返回值也是随机的。而m又是返回值的引用。m获取的数值也是随机的。非法访问不属于自己的空间。
int add(int a, int b)
{b a1;return b;
}int main()
{int m add(1,0);return 0;
}
因此做返回值的时候要保证返回值出了作用域后在上一层调用的空间依然存在。才可以是合法的使用。这种情况由于已经返回给操作系统了所以不能用引用返回只能用传值返回。
传值返回以这个例子来说main函数在调用add函数时由于add有返回值所以建立栈帧的时候会提前由寄存器提供一块临时空间用来拷贝返回的值。所以传值调用是有空间损耗的如果返回的值太大就不是寄存器提供的了。会产生更多的空间消耗。
传引用的话并不会新开辟一块空间而是在原变量上同一块空间中进行操作。所以传引用比传值返回效率高很多。特别在返回的值比较大的时候。 引用和指针的区别
1.引用必须初始化指针可以不初始化。
2.引用一旦引用了一个变量就不能更改。指针可以随意更改指向的空间。
3.引用在sizeof使用时是变量占用的空间大小而指针始终是4/8个字节。
4.没有空引用但有空指针。
5.引用自加是变量1指针是往后偏移一个类型大小
6.引用是定义变量别名指针是储存地址
7.有多级指针但没有多级引用
8.指针在访问实体时要解引用引用是编译器自己处理
9.引用比指针用起来相对更安全。 6.内联函数
以inline修饰的函数叫内联函数内联函数在使用时编译器在编译期间会把这个函数体直接展开而不是调用。调用的话需要建立栈帧。就减少了这部分的空间开销。提升函数运行的效率。
特点
inline是一种以时间会空间的做法虽然将函数体展开了减少了空间的损耗但同时也会使目标文件变大。
内联函数对于编译器来说只是一个建议不同编译器对于inline的实现机制是不一样的。很多编译器都不支持内联递归函数。内联函数一般用于代码量少、频繁调用、流程直接的函数。超过75行的函数不大可能在调用点内联地展开。
inline不支持声明和定义分离。因为inline被展开就没有函数地址了。链接就找不到。 宏的优缺点
优点
1.不限类型
2.增强代码复用性
3.提高性能
缺点
1.不方便调试宏
2.没有类型检查不安全
3.代码可读性差可维护性差容易误用。
C中可以替代宏的部分功能有哪些?
1.短小函数可以用inline
2.常量定义用枚举const enum。