企业网站手机端和pc端一个后台吗,ui设计师怎么做自己的网站,注册工商企业,wordpress+google+ad目录
一、面向对象编程
1.早期概念
2.发展与普及
3. 现代发展
二、从C语言到C
1.关于堆内存的使用
2.关于函数重载
3.关于默认参数
4.引用
5.引用参数
6.作用域符号
三、C的输入输出机制 一、面向对象编程 面向对象编程#xff08;Object-Oriented Programming
1.关于堆内存的使用
2.关于函数重载
3.关于默认参数
4.引用
5.引用参数
6.作用域符号
三、C的输入输出机制 一、面向对象编程 面向对象编程Object-Oriented Programming简称OOP是一种计算机编程范式它使用“对象”来设计应用程序和计算机程序。这种编程范式强调数据和操作数据的函数方法的封装以及对象之间的交互。面向对象编程的由来和发展可以追溯到20世纪60年代以下是其主要的发展历程
1.早期概念 Simula语言1960年代被认为是第一个引入面向对象概念的编程语言。Simula引入了类class和对象object的概念以及继承和动态绑定等特性。 Smalltalk语言1970年代由Alan Kay等人开发是第一个完全基于面向对象概念的编程语言。Smalltalk对后来的面向对象编程语言产生了深远影响它定义了许多现代OOP语言的特性如消息传递、类和对象、继承等。
2.发展与普及 C语言1980年代由Bjarne Stroustrup开发最初称为“C with Classes”。C在C语言的基础上增加了类和对象的概念支持面向对象编程同时也保持了对C语言的兼容性。C的成功使得面向对象编程开始广泛流行。 Objective-C语言1980年代由Brad Cox和Tom Love开发是另一种支持面向对象编程的语言后来被苹果公司用于开发Mac OS X和iOS应用程序。 Java语言1990年代由Sun Microsystems的James Gosling等人开发。Java是一种完全面向对象的编程语言它的跨平台特性通过Java虚拟机实现和简单性使其迅速成为主流编程语言之一。 Python、Ruby等语言1990年代至今这些语言都支持面向对象编程并且各自以简洁的语法和强大的功能吸引了大量开发者。
3. 现代发展 多范式编程语言现代编程语言如C#、JavaScript、Swift等虽然支持面向对象编程但也支持其他编程范式如函数式编程。 设计模式和框架随着面向对象编程的普及出现了许多设计模式如单例模式、观察者模式等和框架如Spring、Hibernate等这些都极大地丰富了面向对象编程的实践。 面向对象编程的核心概念包括封装、继承和多态这些概念使得代码更加模块化、可重用和易于维护。随着技术的发展面向对象编程继续在软件开发领域扮演着重要角色。 二、从C语言到C C是C的扩展C是C的子集C包括C的全部特征、属性和优点。同时增加了对面向对象编程的完全支持。接下来我们先了解C一些特点帮助大家更好的从C过度到C的基本使用。
1.关于堆内存的使用 C中申请堆空间用的是new与delete运算符,这两个类似于c语言中的malloc与free函数。new使用方式如下所示: 语法: 指针变量 new 数据类型: 指针变量 new 数据类型[长度n]; 例如: int *p; pnew int; char *pStr new char[50];
delete使用方式如下: 语法: delete 指针变量: delete[]指针变量;
例如: delete p; delete [] pStr;//对于数组
代码示例
#include iostreamusing namespace std;
int main() {int* p new int(33);//分配一个整数空间4字节,圆括号代表初始化值cout *p endl;int* p2 new int[10];//分配连续的10个整数空间40字节delete p;delete[] p2;return 0;
} 我们可以把new和delete对比着malloc与free来学习: 1从示例中可以看出使用new申请空间并不是以字节为单位的而是以数据类型从而 也无需强制转换。 2要申请多个数据需要使用了中括号释放这块内存的时候也需要中括号。 3注意中括号和圆括号的差别圆括号是初始化中括号是申请多个的意思。 2.关于函数重载 相同的作用域如果两个函数名称相同面参数不同我们把它们称为函数重载函数 重载又称为函数的多态性。请一定注意那个前提:相同的作用域、相同的作用域相同的作用域。
以下几种方式会构成函数重载
形参数量不同 形参类型不同 形参的顺序不同 形参数量和形参类型都不同 总而言之就是参数的不同会构成重载那么构成了重载有什么用处呢? 如果我们的算法需要支持多个数据类型比如求两个数的和想要支持整数浮点数甚至字符串。 如果没有函数重载实现如下:
int AdditionInt(int numA, int numB) {return numA numB;
}
double AdditionDouble(double numA, int numB) {return numA numB;
}
int AdditionStr(char* pNumA, char* pNumB) {int nNumA 0;int nNumB 0;sscanf_s(pNumA, %d, nNumA);sscanf_s(pNumB, %d, nNumB);return nNumA nNumB;
} 对于函数的使用者而言需要记住三个功能类似但是名称不同的函数。而代码写成下面的样子就可以解决这个问题
int Addition(int numA, int numB) {return numA numB;
}double Addition(double numA, int numB) {return numA numB;
}
int Addition(char* pNumA, char* pNumB) {int nNumA 0;int nNumB 0; sscanf_s(pNumA, %d, nNumA);sscanf_s(pNumB, %d, nNumB);return nNumA nNumB;
} 此代码在C语言中会因为函数重名而编译失败,但在C中这则是一个典型的重载函数C会根据传入函数参数的不同进而决定调用哪个函数。有了这个机制使用者仅仅需要记住一个函数名即可随意的往里面传递各种数据类型。函数重载的本质以上的同名函数在C看来实际上是不同的函数名称C为了支持这种特性进而提出了名称粉碎/名字改编(name managling)机制以上面的函数为例他们的函数名分别不同。根据函数参数的不同把函数修改成了不同的名字。
3.关于默认参数 在C中还有一个不错的机制叫做默认参数函数声明或者定义的时候可以给形参赋一些默认值调用函数时若没有给出实参则按指定的默认值进行工作。
int Addition(int a, int b, int c 0, int d 0, int e 0) {return a b c d e;
} 在以上这个例子中调用函数的时候可以传递两个参数也可以传递三个四个五传递的参数不足五个的时候后面的会默认的被传递0。个。需要注意的几个问题: 1函数没有声明时在函数定义中指定形参的默认值 2函数既有定义又有声明时声明时指定后定义后就不能再指定默认值 3当使用了默认参数的同时还使用了重载容易造成二义性
#includeiostream
using namespace std;int fun(int a, int b 5) {//声明与定义在一起,直接写默认参数就可以return a b;
}int fun(int a, int b, int c 3);//1声明与定义不能同时带默认参数int //2这里造成了二义性int main(void) {cout fun(3) endl;cout fun(3, 4) endl;cout fun(3, 4, 5) endl;return 0;
}int fun(int a, int b, int c) {return a b c;
}
4默认值的定义必须遵守从右到左的顺序如果某个形参没有默认值则它左边的参数就不能有默认值。
void funcl(int a, double b 4.5, int c 3);//合法
void funcl(int a 1, double b, int c 3);//不合法
函数调用时实参与形参按从左到右的顺序进行匹配。 4.引用 引用是C引入的新语言特性是C常用的一个重要内容之一正确、灵活地使用引用可以使程序简洁、高效。 引用是给一个变量起别名定义引用的一般格式 类型 引用名 变量名; int nSize; nNum nSize;
需要注意的是: 1由于引用就是变量的一个别名,因此上例中nSize的地址与m的地址是完全一样的 2定义引用时一定要初始化指明该引用变量是谁的别名 3 引用一经初始化不能再引用其他对象。
示例代码
#include iostream
using namespace std;int main(void) {int val 100;//int refval; //Error,引用必须初始化int refval val; refval 200;//将200赋值给refval//实际上改变的是val这个变量cout val val endl;int val2 500;refval val2;//不代表将refval引用至va12这个变量//仅仅只是代表将va12赋值给refvalcout valvalendl;
}
5.引用参数 引用传递方式是在函数定义时在形参前面加上引用运算符” 例如:int swap(int nNumA, int nNumB); 按值传递方式容易理解但形参值的改变不能对实参产生影响地址传递方式通过形参的改变使相应的实参改变但是C的设计者认为这恰巧是C语言程序容易产生错误且难以阅读的原因。 于是引用在这里发挥了重要的作用引用作为参数对形参的任何操作都能改变相应的实参的数据又使函数调用显得方便、自然。
代码示例
#include iostream
using namespace std;//引用作为参数传递
void swap(int x, int y) {int temp x;x y;y temp;
}
int main(void) {int a 5;int b 6;swap(a, b);//在函数调用时引用被初始化xa,yb;cout a a b b endl;return 0;
}
引用和指针的区别: 引用访问一个变量是直接访问而指针里面需要保存变量的地址所以是间接访间 引用是一个变量的别名本身不单独分配自己的内存空间它不是一个单独的变量而指针有自己的内存空间 引用一经初始化不能再引用其它变量而指针可以(非const指针) 尽可能使用引用不得已时使用指针。
三种传参方式比较: 值传递:实参要初始化形参要分配空间将实参内容拷贝到形参 指针传递:传递的是地址能够间接修改函数外部的变量其本质仍是值传递。 引用传递:实参初始化形参的时候不分配空间而是形参实参融为一体修改了形参就是改变了实参。 6.作用域符号
在C中双冒号::被称为作用域解析运算符Scope Resolution Operator。它主要用于以下几个方面
1. 访问全局变量当局部变量与全局变量同名时可以使用::来访问全局变量。例如
int x 10; // 全局变量
void someFunction() {int x 20; // 局部变量std::cout x std::endl; // 输出局部变量x的值即20std::cout ::x std::endl; // 输出全局变量x的值即10
}
2. 访问类成员在类的外部定义成员函数时需要使用::来指定该函数属于哪个类。例如
class MyClass {
public:void myFunction();
};void MyClass::myFunction() {// 函数实现
}
3. 访问命名空间成员当一个命名空间中的名称与另一个命名空间或全局作用域中的名称冲突时可以使用::来指定访问哪个命名空间中的成员。例如
namespace MyNamespace {int x 10;
}int x 20;int main() {std::cout x std::endl; // 输出全局变量x的值即20std::cout MyNamespace::x std::endl; // 输出MyNamespace中的x的值即10return 0;
} 作用域解析运算符::在C中是一个非常关键的工具它帮助程序员清晰地管理和访问不同作用域中的变量和函数有效地解决了命名冲突的问题。
三、C的输入输出机制 I/0流是指输入输出的一系列数据流输出使用插入操作符“”向cout 输出流中插入字符。 在使用 cout 和 cin的时候,需要包含 iostream 这个头文件,并且使用 std 这个命名空间。如下所示:
#include iostream
using namespace std;int main() {cout this is a program;return 0;
}输入使用抽取操作符“”从cin输入流中抽取字符
#include iostream
using namespace std;int main() {int myage;cin myage;int i; float f; long l; cin i f l; return 0;
}
C的输出能够控制输出的数据格式常用格式如下:
控制符描述dec按10进制输出hex按16进制输出oct按8进制输出setfi1l(c)设填充字符为csetprecision(n)设置显示小数精度为n位setw(n)设域宽为n个子符setiosflags(ios::fixed)小数方式表示setiosflags(ios::scientific)指数表示setiosflags(ios::left)左对齐setiosflags(ios::right)右对齐
输出宽度示例 coutsetw(8)10endl;
若数值10和20均按照宽度8输出 coutsetw(8)10setw(8)20endl;
如果一个值的位数大于setw(n)确定的宽度位数则按原宽度输出例如 float amount4.53671; coutsetw(4)amountendl ;
输出八进制十六进制和十进制数示例
#include iostream
#include iomanip
#includestdlib.h
using std::wcout;
using std::endl;
using std::setiosflags;
using std::ios; int main() {int number 1001;wcout LDecimal: std::dec number endl \ LHexadecimal : std::hex number endl \ LOctal: LHexadecimal : std::hex \ std::oct number endl \ setiosflags(ios::uppercase) number endl; system(pause);return 0;
}
控制左右对齐输出默认情况下I/0流以右对齐格式显示。
#include iostream
#include iomanip#includestdlib.h
using std::endl; using std::setiosflags;
using std::setw; using std::wcout;int main() {wcout setiosflags(std::ios::left) setw(5) 1 setw(5) 2 setw(5) 3 endl; wcout setiosflags(std::ios::right) setw(5) 1 setw(5) 2 setw(5) 3 endl; system(pause);return 0;
}
以上是 C提供的输入输出方式使用printf/scanf 依然也是可以的。
如下输出打印一个菱形图案 #include iostream
#include iomanip
#include stdlib.h
using std::wcout;
using std::endl;
using std::setfill;
using std::setw; int main() {for (int i 0; i 7; i) {if (i 4) {wcout setfill(L ) setw(4 - i) L ;wcout setfill(L*) setw(i * 2 1) L* endl;}else {wcout setfill(L ) setw(i - 2) L ;wcout setfill(L*) setw(i - (i - 4) * 3 1) L* endl;}}system(pause);return 0;
}