c++入门书籍推荐,c++入门自学
文章前言一、C关键字(C 98)二、命名空间2.1命名空间定义2.2命名空间使用命名空间有三种方式:1。添加名称空间名称和范围限定符2。使用using在命名空间3中引入成员。使用使用名称空间名称来介绍3。c输入输出4、默认参数4.1默认参数的概念4.2默认参数的分类所有默认参数半默认参数4.3。默认值必须是常量或全局变量4.4。C语言不支持(编译器不支持)5。函数重载5.1。函数重载的概念5.2 name Mangling 5.3 EXTERN“C”VI。引用6.1引用概念6.2引用特征6.3经常引用6.4使用场景1。制作参数2。Make返回值6.5传值和引用的效率比较6.6引用和指针的区别6.7引用和指针的区别:前言1。C关键字(C 98)C共有63个关键字,C语言有32个关键字。
2.Namespace在C/C中,后面还有很多变量、函数、类要学。这些变量、函数和类的名字都将存在于全局工作中。
在域中,可能会有许多冲突。使用名称空间的目的是本地化标识符的名称,以避免命名冲突或名称。
污染,命名空间关键字的出现就是针对这个问题。
2.1命名空间定义定义一个命名空间,需要使用namespace关键字,后面是命名空间的名称,然后是一对{},其中的名称被命名。
空间的成员。
//1.普通名称空间
命名空间N1 //N1是命名空间的名称。
{
//命名空间中的内容,可以定义变量和函数。
int a;
int Add(int left,int right)
{
向左向右返回;
}
}
//2.名称空间可以嵌套
命名空间N2
{
int a;
int b;
int Add(int left,int right)
{
向左向右返回;
}
命名空间N3
{
int c;
int d;
int Sub(int left,int right)
{
向左向右返回;
}
}
}
//3.同一个项目中允许有多个同名的命名空间,编译器最终会将它们合成到同一个命名空间中。
命名空间N1
{
int Mul(int left,int right)
{
返回左*右;
}
}注意:一个名称空间定义了一个新的作用域,名称空间中的一切都局限于那个名称空间。
2.2命名空间的用法应该如何使用命名空间中的成员?例如:
命名空间N
{
int a=10
int b=20
int Add(int left,int right)
{
向左向右返回;
}
int Sub(int left,int right)
{
向左向右返回;
}
}
int main()
{
printf(%d\n ,a);//编译此语句时出错,无法识别a。
返回0;
}命名空间可以有三种使用方式:1。添加命名空间名称和范围限定符int main()
{
printf(%d\n ,N:a);
返回0;
}2.使用using将命名空间中的成员引入using N:b;
int main()
{
printf(%d\n ,N:a);
printf(%d\n ,b);
返回0;
}3.使用using命名空间名称引入using命名空间n;
int main()
{
printf(%d\n ,N:a);
printf(%d\n ,b);
添加(10,20);
返回0;
} C I/O新生婴儿会用自己独特的方式迎接这个全新的世界。C出来之后,是新生事物,那么C是不是也应该向这个美好的世界问好呢?我们来看看C是怎么实现问候语的。
#包括iostream
使用命名空间std
int main()
{
cout Hello world!endl
返回0;
}描述:
当使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包括iostream头文件和std标准命名空间。
介于。
注意:早期的标准库在全局域中实现了所有的函数,并在头文件中用。h后缀,使用时只需要包含相应的头文件。
也就是后来,它实际上会出现在std名称空间中。为了将其与C头文件区分开,并正确使用命名空间,指定了C头文件。
没有。h;旧编译器(vc 6.0)也支持Iostream.h格式,但后续编译器不支持,建议使用。
性病的方式。用C输入输出更方便,不用添加数据格式控制,比如:shaping-% d,character-%。
四。默认参数4.1默认参数的概念默认参数是在声明或定义函数时,为函数的参数指定一个默认值。当调用这个函数时,如果没有指定参数,它将被使用。
默认值,否则使用指定的参数。
void TestFunc(int a=0)
{
cout a endl
}
int main()
{
test func();//当没有传递参数时,使用参数的默认值
test func(10);//传递参数时,使用指定的参数。
}4.2默认参数分类所有默认参数
半默认参数
注意:
半默认参数必须从右到左依次给定,不能分开。默认参数不能同时出现在函数声明和定义中。///a.h
void test func(int a=10);
//交流
void TestFunc(int a=20)
{}
//注意:如果生命和定义的位置同时出现,并且两个位置提供的值不同,那么编译器无法确定应该使用哪个默认值。4.3.默认值必须是常量或全局变量。4.4.C语言不支持(编译器不支持)。五、函数重载5.1。函数重载是函数的一个特例。c允许在同一个作用域中声明几个具有相似函数的同名函数。这
参数列表(参数的个数、类型或顺序)必须不同,常用于处理函数相似的不同数据类型的问题。
int Add(int left,int right)
{
向左向右返回;
}
双加法(双左,双右)
{
向左向右返回;
}
长加法(长左,长右)
{
向左向右返回;
}
int main()
{
添加(10,20);
添加(10.0,20.0);
加(10L,20L);
返回0;
}下面两个函数属于函数重载吗?
短加法(短左,短右)
{
向左向右返回;
}
int Add(短左,短右)
{
向左向右返回;
结果显然不是,因为函数重载的类型与返回值无关。
5.2 name Mangling为什么C支持函数重载,而C语言不支持?
在C/C语言中,一个程序需要经历以下几个阶段:预处理、编译、汇编和链接。
我们的实际项目通常由多个头文件和多个源文件组成,通过我们在C语言阶段学习的编译链接,我们
可以,【在当前a.cpp中调用b.cpp中定义的Add函数时】,编译后链接前不在a.o的目标文件中。
add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中.那我该怎么办呢?所以链接阶段是专门针对这类问题的。当链接器看到a.o调用Add,但是没有Add的地址,就会得到B.O的符号。
在号码表中找到Add的地址,然后将它们链接在一起。(如果学生忘记了上面的流程,我们老师会带学生复习一下。)链接时,连接器将使用哪个名称来查找Add函数?这里的每个编译器都有自己的函数名修饰符。
然后。由于Windows下vs的装修规则过于复杂,而Linux下gcc的装修规则简单易懂,下面我们用gcc演示。
修改后的名称。我们从下面可以看到,修改后gcc的函数名称不变。并将g的函数修改为[_Z函数长度函数名类。
键入姓名首字母]。
用C语言编译器编译结果
这里理解为C语言不能支持重载,因为同名函数无法区分。c以函数修改规则来区分。
点,只要参数不一样,修饰名就不一样,支持重载。另外,我们也明白了为什么函数重载需要不同的参数!与返回值无关。5.3 Extern“C”有时候在C工程中,可能需要按照C的风格来编译一些函数,在函数前加上Extern“C”就是告诉编译器,
按照C语言的规则编译函数。比如tcmalloc是google用C实现的项目,提供了tcmallc()和tcfree。
两个接口来用,但是如果是C项目就不能用了,所以他用extern“C”来解决。
extern C int Add(int left,int right);
int main()
{
添加(1,2);
返回0;
}六。参考6.1参考概念参考不是变量的新定义,而是现有变量的别名。编译器不会为引用的变量打开内存空间,它和它
引用的变量共享相同的内存空间。
比如李悝jy,在国内被称为‘铁牛’,在江湖被称为‘黑旋风’。
类型引用变量名(对象名)=引用实体;
void TestRef()
{
int a=10
int ra=a;//===定义引用类型
printf(%p\n ,a);
printf(%p\n ,ra);
}注意:引用类型必须与引用实体的类型相同。
6.2引用特征引用必须在定义变量时初始化变量。可以有多个引用。一个实体一旦被引用,其他实体就不能被引用。
6.3经常引用void TestConstRef()。
{
const int a=10
//int ra=a;//该语句编译时会出错,A是常量
const int ra=a;
//int b=10;//这个语句编译的时候会出错,B是常量
const int b=10
双d=12.34
//int rd=d;//该语句将以不同类型的错误进行编译。
const int rd=d;
}6.4使用场景1。使参数void Swap(int left,int right)
{
int temp=left
左=右;
右=temp
}2.做返回值int Count()
{
静态int n=0;
n;
//.
返回n;
}下面的代码输出什么结果?为什么?
int Add(int a,int b)
{
int c=a b;
返回c;
}
int main()
{
int ret=Add(1,2);
添加(3,4);
cout Add(1,2)是: ret endl
返回0;
}//ret是一个随机值,因为它是在Add的范围C之外销毁的。
6.5值传递和引用传递的效率比较以值为参数或返回值类型。在参数传递和返回期间,函数不会直接传递实参或直接返回变量,但是
传递参数或返回变量的临时副本,因此使用值作为参数或返回值类型是低效的,尤其是
当参数或返回值类型非常大时,效率就更低了。
6.6引用和指针的区别。在语法概念中,指称是别名,没有独立的空间,与其指称实体共享同一个空间。
int main()
{
int a=10
int ra=a;
cout a= a endl
cout ra= ra endl
返回0;
}底层实现其实是有空间的,因为引用是用指针的方式实现的。
6.7引用和指针的区别:引用在定义时必须初始化。指针不需要引用。初始化时引用一个实体后,就不能引用其他实体,指针可以随时指向同类型的任何一个。
没有对实体的空引用,但sizeof中有一个含义不同的空指针:引用结果是引用类型的大小,但指针始终是地址空间中的字节数(32位平台下占
4字节)实体指自加指增加1,指针自加指指针向后偏移。一个类型的大小有多级指针,但没有多级引用。访问实体有不同的方法,指针需要显式解引用。使用引用编译器处理引用本身比处理指针更安全。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。