C和C++有何区别
// C语言是对面对过程 函数+结构体
// C++ 语言面对对象 + 标准特性
// C++ 里面可以运行C语言,反之,则不行。
#include <stdio.h> //C语言的标准支持
#include <iostream> // C++标准支持
usingnamespace std; // 命名控件 c++ 的特性(java语言的内部类 )
int mian(){
// std::cout << "c++语言的学习" << std::endl;
cout << "c++语言的学习" << std::endl; //省略了std::
// endl == \n 等价与C的换行含义一样
// << 不是属性的运算,操作符重载
cout << "a\n"
<< "b\n"
<< "c\n"
<< "d\n";
retrun 0;
}
C和C++之常量
int main(){
// C语言的常量其实是个假常量
const int number = 100;
// number = 200; 不能修改
int * numP = &number;//拿指针
*numP = 10000;//修改指针所对应的值
printf("%d\n",number);
// 在C++里面 加了const 之后
// int * numP = &number;//拿指针 会报错,是真常量
return 0;
}
引用的原理与常量引用
// C的典型操作:指针取地址 互换
void numberChange(int * number1, int * number2){
int temp = 0;
temp = *number1;
*number1 = *number2;
*number2 = temp;
}
// C++ 提倡的引用 &
void numberChange2(int & number1, int & number2){
//这里了解C的话还是很好理解,使用了&引用之后指针地址跟main里的指针地址是一样的
// 如果是单纯把变量number1传递过来,实际上当前函数是重新创建了一个
// 同名number1来接收的,内存地址就不一样了。
int temp = 0;
temp = number1;
number1 = number2;
number2 = temp;
}
int main(){
// 两个数互换
int number1 = 10;
int number2 = 20;
numberChange(&number1,&number2);
cout << "n1:" << number1 << "n2:" << number2 >>endl;
numberChange2(number1,number2);
cout << "n1:" << number1 << "n2:" << number2 >>endl;
// 引用实验,来学原理;
//第一种
int n1 = 999;
int n2 = n1;
//两个内存地址不一样,内存地址不一样,值一样,这里的复制是值的复制。
cout << &n1 << &n2 << endl;
//第二种
int n1 = 999;
int &n2 = n1;
//两个内存地址一样,实际上先有了n1,再来个n2,可以理解为给n1再取个别名,
//还是只有一个指针,只有一个内存,只有一个值。
cout << &n1 << &n2 << endl;
n2 = 777;
cout << n1 << n2 << endl;//n1和n2都等于777
return 0;
}
常量引用
#include <iostream>
using namespace std;
//代码的统一性
typedef struct{
char name[20];
int age;
}Student;
//插入数据库,Student的信息插入数据库
void inserStudent(Student student){
//内鬼,修改了
//strcpy(student,name,"李元霸");
}
//插入数据库,Student的信息插入数据库,常量引用
void inserStudent(const Student & student){
//不能那样修改了
cout << student.name << "," << student.age << endl;
}
int main(){
// 用户提交的Student 数据
Student student = {"张无忌", 30};
insertStudent(student);
return 0;
}
函数重载
C语言不支持重载
#include <stdio.h>
void add (int number1, int numnber2){
}
//error: conflicting types for 'add' 已有函数主体
//你在C里面搞了重载是不允许的
void add(int number1, int number2, int number3){
}
C++默认支持重载 == java 重载
#include <iostream>
using namespace std;
//int add(int number1, int number2) = number1 + number2;// 这个是KT写法
int add (int n1, int n2) {
return n1 + n2;
}
// 跟java的重载一样
int add(int n1, int n2, int n3){
return n1 + n2 + n3;
}
// 默认形参 跟KT一样,函数重载有默认形参的时候,调用默认是指向有默认形参的函数
int add(int n1 = 100, bool isOk = 0) {}
// 调用的时候必须传递char * 之外还必须传递一个int类型,你可以认为是预留参数
void uploadLogToEngine(char * logText, int){}
C++面对对象
#include <iostream>
using namespace std;
// Student.h 头文件 只写声明,不写实现
class Student{
private : // 下面的代码都是私有(成员和函数)
char * name;
int age;
public: // 下面的代码都是公开(成员和函数)
// set get
void setAge(int age);//声明函数
void setName(char * name);
void getAge();
char * getName();
};
#include "Student.h"
// 根据Student.h 头文件 写实现 Student.cpp
void Student::setAge(int age){
// -> 调用一级指针,C++对象指向的是一个指针
this->age = age;
}
void Student::setName(char * name){
this->name = name;
}
void Student::getAge(){
return this->age;
}
void Student::getAge(){
retrun this->name;
}
#include <iostream>
using namespace std;
int mian(){
// 规范写法:要有头文件.h .hpp -- 实现文件.c cpp
Student student1; //栈区开辟的空间
student1.setAge(99);
student1.setName("李连杰");
cout << "name:" << student1.getName() << ",age:" << student1.getAge() << endl;
//
Student * student2 = new Student(); //堆区开辟的空间
student2->setAge(99);
student2->setName("李连杰");
cout << "name:" << student2->getName() << ",age:" << student2->getAge() << endl;
delete Student2;//必须手动释放堆空间的对象
student2 = NULL;
return 0;
//正规的流程:XXX.so (c/cpp的实现代码)这是加密的,头文件是公开的
}