博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++之旅(第一天)
阅读量:6830 次
发布时间:2019-06-26

本文共 4869 字,大约阅读时间需要 16 分钟。

基础知识

完全支持C语言

可以在C++引入C的头文件

#include 
#include
int main() {}

输入和输出

C++中的输入使用cin,输出使用cout

#include 
#include
int main() { int i; //C++中的输入和输出 std::cin >> i; std::cout << i << std::endl; //C中的输入和输出 scanf("%d", &i); printf("%d\n", i);}

名字空间

为了在大型项目开发中解决类,函数命名冲突问题而引入了namespace。下面的代码中引入了C++中的标准库命名空间std,这样我们就不用在cin,cout,endl前面添加命名空间了

#include 
using namespace std;namespace outer { void outerTest() { cout << "this is outer namespace" << endl; }}int main() { outer::outerTest();}

结构体和类

结构体成员默认对外开放,随时随地都可以访问。class中的成员默认私有,无法直接访问。这里的struct和class一样,内部可以使用权限修饰符,函数等。

#include 
struct man { int age; int sex;};class man2 { int age; int sex;};int main() { man m; m.age = 10; // 可以正常赋值 m.sex = 0; // 可以正常赋值 man2 man2; man2.age = 11; // 编译报错 man2.sex = 1; // 编译报错}

对象的分配

通过new创建对象,通过delete释放对象,注意数组的释放有点特殊;

int main() {
int* p1 = new int();
int* p2 = new int[10];
delete p1;
delete []p2;
}

引用

引用不是地址,只是变量的别名,引用不占用空间,引用只能被初始化一次且在声明时初始化。

#include 
#include
using namespace std;void mSwap (int &a, int &b) { int tmp; tmp = a; a = b; b = tmp;}int main() { int a = 10; int b = 5; mSwap(a, b); //交换成功 cout << a << b << endl; //引用在声明时必须被初始化且不能更改 int& c = a; //输出的值一致,所以引用不占空间 printf("c地址为:%p, a地址为:%p\n", &c, &b);}

在值传递的情况下,void mSwap (int a, int b)它会将传入的参数拷贝一份,然后在自己的栈帧内对拷贝的数据进行操作。而使用引用传递void mSwap (int& a, int& b)则会直接操作main函数栈帧上的变量,所以后者能交换成功,这就是跨栈操作。如果希望传递引用又不想被修改可以使用下面方式

void mSwap (const int &a) {    cout << a << endl;}

缺省参数

#include 
using namespace std;void m (int a = 10) { cout << a << endl;}int main() { m(); // 输出10 m(11); // 输出11}

模版

模版在对不同数据做相同操作时用到,其核心就是泛型。下面就是一个模版函数的使用,可以支持整型和浮点的加操作

#include 
using namespace std;template
T myadd(T a, T b) { return a + b;}int main() { cout << myadd(1, 2) << endl; cout << myadd(1.0, 3.0) << endl;}

指针常量与常量指针

指针常量:指针是个常量,不能修改指针的值;常量指针:指针指向的位置是个常量(在指针看来),不能通过指针修改其值

int main() {    int a=0;    int b = 1;    // 指针常量,p的值不能被修改    int* const p = &a;    p = &b;   //编译错误,不能修改p的值    *p = 10;    // 常量指针,p1的值可以被修改    const int* p1 = &a;    p1 = &b;    *p1 = 10;   //编译错误,不能通过指针p1修改其指向的值    a = 11;    b = 12;}

类的初始化

man.h文件中声明一个类

#ifndef MAN_H#define MAN_H#include 
using namespace std;class Man { public: Man(); ~Man(); protected: private: int& a; int b; string name; const int age;};#endif // MAN_H

man.cpp中初始化成员

#include "man.h"Man::Man():age(10),a(b) {  // 注意常量,引用必须在成员列表初始化    name = "tom";}Man::~Man() {    //dtor}

拷贝

拷贝一般应实现拷贝函数,如果未实现则采用默认拷贝函数

class Test {    public:        Test(const Test& t);  //自定义拷贝函数} Test t1;Test t2 = t1;   //调用拷贝函数

静态变量与静态成员

在C中一个变量被static修饰后,这个变量将处于静态数据区。比如下面的代码,程序被加载到内存后,只有当test1被调用后变量a才会被创建(在栈上创建)。但是对于test2而言,程序一旦被加载,即使没有调用test2,变量a都存在了。

void test1(){    int a = 0;}void test2() {    static int a = 0;}

C++中的静态成员属于类成员,只要类被加载了,该成员就就会在内存中被创建出来。

静态成员只能在类外部被初始化。

Man.h文件中声明类

class Man{public:    Man();    ~Man();    static int a;};

Man.cpp

#include "Man.h"int Man::a = 100; //对静态成员初始化Man::Man(){}Man::~Man(){}

数组的初始化

定义一个对象数组

int main(int argc, char **argv) {    //调用无参构造函数    Man man[3];      //调用有参构造函数    Man man2[3] = {Man(1), Man(2), Man(3)};    }

实践

MyString.h

#ifndef MYSTRING_H#define MYSTRING_Hnamespace xdysite {    class MyString {                public:            MyString(const char* str);            ~MyString();            MyString(const MyString& myString);            const char* getString();            void setString(const char* str);        private:            char* str;        };}#endif // MYSTRING_H

MyString.cpp

#include "MyString.h"#include 
#include
using namespace std;xdysite::MyString::MyString(const char* str) { int len = strlen(str); this->str = new char[len + 1]; strncpy(this->str, str, len);}xdysite::MyString::~MyString() { delete []str; str = NULL;}xdysite::MyString::MyString(const MyString& myString) { int len = strlen(myString.str); str = new char[len + 1]; strncpy(str, myString.str, len);}const char* xdysite::MyString::getString() { return str;}void xdysite::MyString::setString(const char* str) { int len1 = strlen(str); int len2 = strlen(this->str); if(len2 >= len1) strncpy(this->str, str, len1); else { delete []this->str; this->str = new char[len1 + 1]; strncpy(this->str, str, len1); }}

man.cpp

#include 
#include "MyString.h"using namespace std;using namespace xdysite;int main(int argc, char **argv) { MyString myString = "hello world!"; MyString myString2 = myString; myString.setString("HELLO"); cout << myString2.getString() << endl;}

转载于:https://www.cnblogs.com/xidongyu/p/6890883.html

你可能感兴趣的文章
Android Studio Failed to open zip file
查看>>
Kubernetes 学习笔记(二)--- K8S应用快速入门
查看>>
MFC读写EXIF信息,图片非占用
查看>>
mysql进阶(六)
查看>>
聊聊设计模式之策略模式
查看>>
redis3.2启动配置文件redis.conf说明
查看>>
阿里云建站严选
查看>>
bboss分布式事件框架介绍文档
查看>>
基于Element-admin-ui开发后台管理系统
查看>>
2.[Andriod]Andriod Studio结合Visual Studio Emulator for Android调试Android App
查看>>
改变世界前,先改变自己
查看>>
《React Native 精解与实战》书籍连载「Node.js 简介与 React Native 开发环境配置」...
查看>>
Java_异常_01_org.apache.commons.lang.exception.NestableRuntimeException
查看>>
1-AIV--使用ContentProvider获取短信
查看>>
前端优化系列 - 前端优化的思考
查看>>
火爆GitHub:100天搞定机器学习编程(超赞信息图+代码+数据集)
查看>>
TongDXP
查看>>
Python进阶-算法-插入排序
查看>>
C# 如何添加水印到PPT
查看>>
北京朝阳区第二批重点产业发展引导资金项目即将开始征集
查看>>