基础知识

完全支持C语言

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

#include <stdio.h>
#include <iostream>
int main() { }

输入和输出

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

#include <stdio.h>
#include <iostream>
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 <iostream>
using namespace std; namespace outer {
void outerTest() {
cout << "this is outer namespace" << endl;
}
} int main() {
outer::outerTest();
}

结构体和类

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

#include <iostream>

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 <iostream>
#include <stdio.h>
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 <iostream>
using namespace std;
void m (int a = 10) {
cout << a << endl;
} int main() {
m(); // 输出10
m(11); // 输出11
}

模版

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

#include <iostream>
using namespace std; template <class T>
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 <string>
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_H namespace 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 <algorithm>
#include <cstring>
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 <iostream>
#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;
}

C++之旅(第一天)的更多相关文章

  1. CSS之旅——第一站 为什么要用CSS

    不知道有多少码农和我一样,css一直是一个软肋,软到全身酥麻...既然软肋来了,只能是要想办法解决,所以就找本CSS权威指南看一看,都说 CSS权威指南这本书比较过时,但是内容还是比较充实的,而且内容 ...

  2. asp.net mvc 之旅—— 第一站 从简单的razor入手

    记得2011年mvc3刚出来的时候,我们就有幸将 mvc3 用在我们团购项目上,当时老大让我们用一个星期时间来熟悉mvc,幸好园子里面的老朋友DR 正在写mvc3系列,也恭喜这个系列文章被整理成专题供 ...

  3. Javascript之旅——第一站:从变量说起

    工作这几年,js学的不是很好,正好周末有些闲时间,索性买本<js权威指南>,大名鼎鼎的犀牛书,好好的把js深入的看一看.买过这本 书的第一印象就是贼厚,不过后面有一半部分都是参考手册. 一 ...

  4. Python学习之旅--第一周--初识Python

    一:Python是一种什么样的语言? 1.语言的分类: a.编译型语言和解释性语言: 通常所说的计算机语言分为编译型和解释型语言.编译型语言典型的如C,C++,通常在程序执行之前必须经由编译器编译成机 ...

  5. Mybatis之旅第一篇-初识Mybatis

    一.JDBC的问题 为什么我们要使用Mybatis,是因为JDBC存在以下问题 1. 数据库连接创建.释放频繁造成系统资源浪费,从而影响系统性能.如果使用数据库连接池可解决此问题. 2. Sql语句在 ...

  6. 我的Java之旅 第一课 开发环境准备

    1.JDK JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK). SE(J2SE),standard edition,标准版,是我们通常用的一个版本,从J ...

  7. Juce之旅-第一个例子(图形窗口)

    以这么说现在的人越来越妖精了,本来软件吗,要的是简单稳定实用,但是看现在的趋势是越来越多人注重界面的美化和和效果.比如IM类软件,QQ,飞信还有土的掉渣的MSN等,前两天看了一下YahooUI,觉得不 ...

  8. weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架

    写在前面的话: weex官方文档不完善,在整个实施过程中遇到过很多坑,中途几次想放弃,总是有些不甘心.攻坚克难,总也是会有一些收获,先将收获进行分享也或是记录,防止忘记.要想用好weex必须对es5/ ...

  9. Sql Server之旅——第一站 那些给我们带来福利的系统视图

    本来想这个系列写点什么好呢,后来想想大家作为程序员,用的最多的莫过于数据库了,但是事实上很多像我这样工作在一线的码农,对sql 都一知半解,别谈优化和对数据库底层的认识了,我也是这样... 一:那些系 ...

  10. html5学习之旅第一篇

    什么是 HTML5? HTML5 是下一代 HTML 标准. HTML , HTML 4.01的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTML5 仍处于完善之中.然 ...

随机推荐

  1. Android 模拟机出现Installation failed due to invalid URI!错误

    [2017-03-28 09:52:13 - DataVDemo06] Installation failed due to invalid URI![2017-03-28 09:52:13 - Da ...

  2. mysql5.5的安装配置

    1.wget http://120.52.72.23/cdn.mysql.com/c3pr90ntc0td//Downloads/MySQL-5.5/mysql-5.5.50-linux2.6-x86 ...

  3. ipc 进程间通讯的AIDL

    1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间 ...

  4. PHP mysql基本语句指令

    /*选择数据库 use test; */ /* 显示所有的数据库 show databases; */ /*删除表/数据库 drop database test1; delete from user1 ...

  5. Java中对List集合的常用操作(转载)

    目录: list中添加,获取,删除元素: list中是否包含某个元素: list中根据索引将元素数值改变(替换): list中查看(判断)元素的索引: 根据元素索引位置进行的判断: 利用list中索引 ...

  6. 01.ZooKeeper安装和介绍

    1.ZooKeeper安装和启动 1.下载解压ZooKeeper ZooKeeper官方地址:http://zookeeper.apache.org/ 下载当前稳定版本:zookeeper-3.4.6 ...

  7. 170407、java基于nio工作方式的socket通信

    客户端代码: /** * */ package com.bobohe.nio; import java.io.BufferedReader; import java.io.IOException; i ...

  8. Code Forces 644B Processing Queries

    B. Processing Queries time limit per test5 seconds memory limit per test256 megabytes inputstandard ...

  9. c 整数运算

    一.无符号加法(形式的模运算,无符号加法等价于计算模2w 的和) 示例:非负数 x 和 y 位数: w(8位机) 范围: 0 <= x,y <= 2w -1 结果:0 <= x+y ...

  10. element自定义表单验证

    element-ui框架下修改密码弹窗进行表单验证. 除了基础校验,密码不为空,长度不小于6字符,需求中还需校验密码由数字和字母组合. 处理代码如下: <el-dialog :visible.s ...