nuxt做多页面网站,微网站 微官网的区别,个人网页设计论文范文,网页制作工具中可进行网页内容定位产生非对称效果的是c#xff08;一#xff09; C与C有什么区别命名空间使用 输入输出流引用指针和引用的区别定义拓展 函数重载例子测试函数重载原理 参数默认值什么是参数默认值注意 在c中如何引入c的库动态内存分配new、delete与malloc、free的区别#xff1f; C与C有什么区别 1都是… c一 C与C有什么区别命名空间使用 输入输出流引用指针和引用的区别定义拓展 函数重载例子测试函数重载原理 参数默认值什么是参数默认值注意 在c中如何引入c的库动态内存分配new、delete与malloc、free的区别 C与C有什么区别 1都是编程语言 2C是面向过程的C是面向对象的 3第一个字母都是相同在C语言中只要是合法的C语言语句在C中都是可以使用的(C完全兼容C) 4:在C的基础上增加了一些新的内容(新特性、关键字、数据类型等等) 5C是面向过程的编程语言C是面向对象的编程语言C是注重过程的C注重的是结 果C也有在面向对象编程是通过结构体但是因为C里面的结构体中只能描述属性不能有函数所以面向对象编程不够彻底引入C来解决这个问题 命名空间
理解成是一个容器可以放数据类型、函数、变量 为了解决在C语言中能出现同名的函数吗能出现同样的自定义的数据类型吗 在同一个作用域内能出现同名的变量吗 都不可以的 作用解决命名冲突命名冲突的情况 函数、数据类型、变量 格式 namespace 命名空间的名字 { 函数 数据类型 变量 } namespace s1
{int count 10;struct STU_T{int sno;char name[20];};void print(){printf(s1中的count%d\n, count);}
}
namespace s2
{int count 10;struct STU_T{int sno;char name[20];};void print(){printf(s2中的count%d\n, count);}
}使用
方法1 命名空间::函数();
int main()
{//使用方法1s1::print();s2::print();printf(hello world\n);return 0;
}方法2 将命名空间搞成全局变量访问时只需要变量前面加上(域运算符)
using namespace s1; //切换到这个命名空间中》把命名空间中的内容做成全局
int main()
{//使用方法2::print();printf(%d\n, count);//使用方法1s2::print();printf(hello world\n);return 0;
}输入输出流
流 以字节为单位 连续不断方向统一的。 C中标准输入输出函数 printf()、scanf()、 putchar()、getchar()、 gets()、puts()。这些函数在C中仍然是可以使用的除此之外C中引入了新的可以做输入输出的方法
//之前需要引用
#include iostream
using namespace std;输入:cin 变量;
输出:cout 变量;引用 是一种数据类型用来给变量起别名 弱化指针(在C中可以用指针来实现的,在C中都可以使用引用来替换) 减少临时空间的分配 指针和引用的区别
1. 指针可以定义后不初始化但引用定义后必须初始化 2. 指针定义时需要开辟内存空间引用和变量公用同一块内存空间不会重新分配内存空间 3. 指针是存储某个实例的地址引用是实例的别名 4. 指针变量的值可以为空引用没有空引用 5. 理论上指针级数没有限制但引用只有一级不存在引用的引用但可以有指针的指针 6. 不可以对函数的局部变量或对象以引用或者指针的方式返回 7. 引用与指针效果不同对指针变量的操作会使指针指向下一个实体的地址而不是改变所指实体的内容 8. 对指针变量使用“sizeof”得到的是指针变量的大小对引用使用“sizeof”得到的是变量的大小 9. 指针变量作为形参时需要测试合法性进行判空引用不需要判空 10. 指针使用时要加 “ * ”引用可以直接使用 11. 指针是可以改变指向的 引用是不可以改变指向的 引用比指针安全
定义
数据类型 别名 变量名;
//注意引用必须初始化一旦初始化之后再不能给引用赋值拓展
int a 10;
const int a_pt a;
a_pt 20;//error(不能对引用再次赋值)
const int m 200;// 等价于 #define m 200函数重载 解决命名困难的问题 概念函数功能相似函数名相同参数不同与返回值类型无关的一组函数互为重载 参数不同 参数个数不同、参数类型不同、参数类型的顺序不同 例子
#include iostream
using namespace std;int sum(int a, int b)
{cout int,int endl;return a b;
}
int sum(int a, double b)
{cout int, double endl;return a b;
}
int sum(double a, int b)
{cout double, double endl;return a b;
}
int sum(int a)
{cout int endl;return a 0;
}
double sum(double a, double b)
{cout double, double endl;return a b;
}
char sum(char a, char b)
{cout char, char endl;return a b;
}
string sum(string a, string b)
{cout string,string endl;return a b;
}int main()
{//调用的函数名是相同的只是传入了不同的参数他根据传入的参数的类型匹配了对应的函数去执行了cout sum(5) endl;cout sum(5,6) endl;cout sum(5.3, 6) endl;cout sum(5, 6.8) endl;cout sum(5.3, 6.8) endl;cout sum(A, \0) endl;cout sum(123, abc) endl;//如上执行了不同的代码块根据函数调用的原理说明每一个调用函数的地方函数地址都是不同的也就说明// 函数名应该是不一样的 函数名不一样那是因为用的编译器不同了 gcc / greturn 0;
}1.函数调用原理在调用函数的地址其实保存的是函数的地址执行的时候会根据函数地址到对应的内存空间然后执行对应的代码块 2.当代码块执行完之后再返回到调用函数的地址继续向下执行 测试
同一个.c文件分别使用gcc和g进行编译使用nm 可执行文件名 gcc编译后的结果函数名没有变 g编译后的结果 函数名发生变化了 根据函数名的长度、函数名、参数的个数以及参数的类型进行重命名名字发生了变化对应函数的地址也就不同执行的时候就根据不同的地址执行不同代码块
函数重载原理
使用g编译后函数名根据函数名的长度、参数个数、数据类型进行了重命名函数名变了地址也就 变了调用时执行的就是不同的函数体
参数默认值 简化代码 函数重载当只有参数个数不同的情况下造成的代码冗余 什么是参数默认值
在定义/声明的时候给形参进行初始化
int sum(int a 0,int b 0,int c 0)注意
写默认参数的时候是从右至左因为调用的时候实参给的顺序是从左至右 没有给默认参数传参时就按默认值处理给默认参数传参时就按传入的实参进行处理 二义性函数重载有默认参数时解决保留参数个数最多的且有默认值的函数 当声明和定义同时存在时参数默认值只能放在函数声明中
在c中如何引入c的库
以静态库为例 使用gcc编译 使用g编译 问题使用g编译时函数的名称发生了改变 解决使用g编译器编译时函数的名称不能发生改变 问题如何判断是gcc还是g编译器 方法1通过宏来判断
__cplusplus方式2通过单个字符来测试
在c里面单个字符当做整型来用长度是四个字节 在c里面单个字符占一个字节 动态内存分配
在C语言中使用malloc做动态内存分配 使用free去做释放
int main()
{int* p nullptr;p (int *)malloc(4 * 4);if (pnullptr){printf(malloc error\n);return -1;}else{memset(p, 0, sizeof(int)*4);*p 100;*(p1) 200;*(p 2) 300;*(p 3) 400;free(p);}return 0;
}在C中引入新的方式来动态内存分配 new运算符开空间 delete 运算符释放空间
语法:
一块空间分配与释放
数据类型 *变量 new 数据类型; //不初始化
delete 变量;
数据类型 *变量 new 数据类型();//有初始化
delete 变量;
连续空间分配与释放
数据类型 *变量 new 数据类型[几块]; //不初始化
delete [] 变量;
数据类型 *变量 new 数据类型[元素个数]();//括号int main()
{int* p nullptr;//去堆区分配了4字节的内存空间p new int;cout *p endl; // 随机数----没有初始化int* pp nullptr;//去堆区分配了4字节的内存空间pp new int(6);cout *pp endl; // 自动进行了初始化不 传值默认值为0传了值进来就按传进来的值进行初始化char* ptr new char[10]; //连续分配了10char类型的空间cout ptr endl;delete p; //释放一块空间delete [] ptr; //释放连续空间return 0;
}new、delete与malloc、free的区别 new/delete是c的操作符而malloc/free是库函数 new 在调用时会先为对象分配内存再调用对象的构造函数而malloc不会 delete 在调用时会调用析构函数而free不会 使用malloc为对象指针分配内存要明确指定分配内存大小而new不需要 new作为操作符可以被重载而malloc不行 new分配内存成功则返回对象指针而malloc分配成功会返回void*类型指针 new如果分配内存失败会抛出bad_alloc异常而malloc分配内存会返回NULL指针 new从自由存储区为对象分配内存malloc从堆上分配内存自由存储区可以在堆也可以在其他地方比如静态存储区这取决于编译器从哪里为new的使用分配内存。