C++基础知识

释放双眼,带上耳机,听听看~!

一,g++基础

g++ –version 查看版本


1
2
3
4
5
6
7
8
9
10
1#include <iostream>
2using namespace std;
3int main()
4{
5//hahha
6cout<<"hello world"<<endl;
7return 0;
8}
9
10

直接生成可执行程序test

g++ -o test test.cpp

C++基础知识

深入解析生成可执行程序test的过程

1.g++ -E test.cpp > test.i

这一步生成test.i进行预处理,做了宏的替换,注释的消除,可看见//hahha不见了

C++基础知识

2.g++ -S test.cpp

这一步生成test.s,表示生成汇编指令

C++基础知识

3.g++ -c test.cpp 

这一步生成test.o,将汇编语言变成目标代码,生成目标文件,也就是二进制文件

C++基础知识

4.g++ test.o -o test

链接目标代码生成可执行程序test

C++基础知识

上述编译过程产生了下面的文件

C++基础知识

Makefile可以有效的减少大工程中需要编译和链接的文件,只编译和链接那些需要修改的文件,可以说使用Makefile,整个工程都可以完全自动化编译。

利用makefile对.cpp文件进行编译链接

DisplayImage.cpp


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
1#include <iostream>
2#include <cv.h>
3#include <highgui.h>
4
5//使用cv这个命名空间
6using namespace cv;
7using namespace std;
8/*
9 *一般有两种写法:
10 *main( int argc, char* argv[])
11 *main( int argc, char** argv)
12 */
13int main( int argc, char** argv )
14{
15  //建立一个Mat类型的变量image
16  Mat image;
17  /* API中有:
18   * C++: Mat imread(const string& filename, int flags=1 )
19   * 意思是返回Mat类型数据,第一个参数接受一个string类型的引用,
20   * 第二个参数接受一个int类型的flags,一般都是1。
21   */
22  image = imread( argv[1], 1 );
23
24  //当传的参数不是一个,或者图片没有数据则提示没有图片并退出程序
25  if( argc != 2 || !image.data )
26    {
27      cout<<"没有该图片"<<endl;
28      return -1;
29    }
30
31  //C++: void namedWindow(const string& winname, int flags=CV_WINDOW_AUTOSIZE )
32  namedWindow( "显示图片", CV_WINDOW_AUTOSIZE );
33  //C++: void imshow(const string& winname, InputArray mat)
34  imshow( "显示图片", image );
35  //C++: int waitKey(int delay=0)
36  waitKey(0);
37
38  return 0;
39}
40
41

编写makefile,在这里要注意opencv库和头文件


1
2
3
4
5
6
7
8
9
10
11
12
1export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/fzh/usr/lib/pkgconfig
2
3CXXFLAGS:=$(shell pkg-config --cflags --libs opencv)
4
5DisplayIMage:DisplayImage.o
6        g++ DisplayImage.o -o DisplayImage          $(CXXFLAGS)
7DisplayImage.o:DisplayImage.cpp
8        g++ -c DisplayImage.cpp -o DisplayImage.o   $(CXXFLAGS)
9clean:
10        rm *o  DisplayImage
11
12

执行make

 ./DisplayImage dog.png

C++基础知识

利用Cmake对cmakelists.txt进行编辑,会自动生成makefile

cmake –version 

安装cmake apt-get install cmake

1.编写CMakeLists.txt


1
2
3
4
5
6
7
1cmake_minimum_required(VERSION 2.8)
2project(DisplayImage)
3find_package(Opencv REQUIRED)
4add_executable(DisplayImage DisplayImage.cpp)
5target_link_libraries(DisplayImage ${OpenCV_LIBS})
6
7

cmake .

进行编译

make生成DisplayImage

 ./DisplayImage dog.png

 

**二,输出hello world **

1.g++用法

C++基础知识

g++ -o hello hello.cpp

C++基础知识

C++基础知识

2.int argc, char** argv参数


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1#include <iostream>
2using namespace std;
3
4int main(int argc, char** argv)
5{
6    cout << "You have entered " << argc
7         << " arguments:" << "\n";
8
9    for (int i = 0; i < argc; ++i)
10        cout << argv[i] << "\n";
11
12    return 0;
13}
14
15

g++ -o main main.cpp

C++基础知识

** 三.指针与引用**

1.指针


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1#include <iostream>
2
3using namespace std;
4
5int main ()
6{
7   int  var1=10;
8   char var2[10];
9   int  *ip; // 指针变量的声明
10
11   cout << "var1 变量的地址: ";
12   cout << &var1 << endl;
13
14   cout << "var2 变量的地址: ";
15   cout << &var2 << endl;
16
17   ip = &var1;       // 在指针变量中存储 var 的地址
18
19   // 输出在指针变量中存储的地址
20   cout << "Address stored in ip variable: ";
21   cout << ip << endl;
22
23      // 访问指针中地址的值
24   cout << "Value of *ip variable: ";
25   cout << *ip << endl;
26
27   cout << "Value of var variable: ";
28   cout << var1 << endl;
29
30   return 0;
31}
32

C++基础知识

2.引用


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1#include <iostream>
2
3using namespace std;
4
5int main( )
6{
7
8   int i;
9   double d;
10
11   int& r=i;
12   double& s=d;
13   i=5;
14   cout<<"i="<<i<<endl;
15   cout<<"r="<<r<<endl;
16
17}
18

C++基础知识

四,安装C++版的opencv

1.安装

sudo apt-get install libopencv-dev python-opencv

编译命令:

g++ -o main xxx.cpp 

1
1`

pkg-config –cflags –libs opencv

1
1`

1
1`

pkg-config –cflags –libs opencv

1
1`

起到include opencv的作用

C++基础知识

例如 g++ -o main globalmatting.cpp guidedfilter.cpp main.cpp

1
1`

pkg-config –cflags –libs opencv

1
1`

然后在./main 输出结果

查看当前版本

pkg-config –modversion opencv

C++基础知识

2.利用opencv读取与显示一张图片


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
1#include <iostream>
2#include <cv.h>
3#include <highgui.h>
4
5//使用cv这个命名空间
6using namespace cv;
7using namespace std;
8/*
9 *一般有两种写法:
10 *main( int argc, char* argv[])
11 *main( int argc, char** argv)
12 */
13int main( int argc, char** argv )
14{
15  //建立一个Mat类型的变量image
16  Mat image;
17  /* API中有:
18   * C++: Mat imread(const string& filename, int flags=1 )
19   * 意思是返回Mat类型数据,第一个参数接受一个string类型的引用,
20   * 第二个参数接受一个int类型的flags,一般都是1。
21   */
22  image = imread( argv[1], 1 );
23
24  //当传的参数不是一个,或者图片没有数据则提示没有图片并退出程序
25  if( argc != 2 || !image.data )
26    {
27      cout<<"没有该图片"<<endl;
28      return -1;
29    }
30  
31  //C++: void namedWindow(const string& winname, int flags=CV_WINDOW_AUTOSIZE )
32  namedWindow( "显示图片", CV_WINDOW_AUTOSIZE );
33  //C++: void imshow(const string& winname, InputArray mat)
34  imshow( "显示图片", image );
35  //C++: int waitKey(int delay=0)
36  waitKey(0);
37
38  return 0;
39}
40

g++ -o test test.cpp

1
1`

pkg-config –cflags –libs opencv

1
1`

C++基础知识

./test input.jpg  则显示正常.

五,类

1.类的实例化


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
1#include <iostream>
2
3using namespace std;
4
5class Box
6{
7   public:
8      double length;   // 盒子的长度
9      double breadth;  // 盒子的宽度
10      double height;   // 盒子的高度
11};
12
13
14
15
16int main()
17 {
18
19    Box Box1;  // 声明 Box1,类型为 Box
20    Box Box2;
21    double volumn=0.0;
22
23    Box1.length=5.0;
24    Box1.height=6.0;
25    Box1.breadth=2.0;
26
27    Box2.length=1.0;
28    Box2.height=6.0;
29    Box2.breadth=2.0;
30
31    volumn=Box1.length*Box1.height*Box1.breadth;
32    cout<<"box1 volumn="<<volumn<<endl;
33
34    volumn=Box2.length*Box2.height*Box2.breadth;
35    cout<<"box2 volumn="<<volumn<<endl;
36
37 }
38
39

2.构造函数


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
1#include <iostream>
2
3using namespace std;
4
5class Line
6{
7   public:
8      void setLength( double len );
9      double getLength( void );
10      Line(double len);  // 这是构造函数
11
12   private:
13      double length;
14};
15
16
17// 成员函数定义,包括构造函数
18Line::Line( double len)
19{
20    cout << "Object is being created, length = " << len << endl;
21    length = len;
22}
23
24void Line::setLength( double len )
25{
26    length = len;
27}
28
29double Line::getLength( void )
30{
31    return length;
32}
33// 程序的主函数
34int main( )
35{
36   Line line(10.0);
37
38   // 获取默认设置的长度
39   cout << "Length of line : " << line.getLength() <<endl;
40   // 再次设置长度
41   line.setLength(6.0);
42   cout << "Length of line : " << line.getLength() <<endl;
43
44   return 0;
45}
46

C++基础知识

3.析构函数

其是类的一种特殊的成员函数,在删除创建的对象时执行。析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
1#include <iostream>
2
3using namespace std;
4
5class Line
6{
7   public:
8      void setLength( double len );
9      double getLength( void );
10      Line(double len);  // 这是构造函数
11      ~Line();  // 这是析构函数声明
12
13   private:
14      double length;
15};
16
17
18// 成员函数定义,包括构造函数
19Line::Line( double len)
20{
21    cout << "Object is being created, length = " << len << endl;
22    length = len;
23}
24// 析构函数
25Line::~Line(void)
26{
27    cout << "Object is being deleted" << endl;
28}
29
30void Line::setLength( double len )
31{
32    length = len;
33}
34
35double Line::getLength( void )
36{
37    return length;
38}
39// 程序的主函数
40int main( )
41{
42   Line line(10.0);
43
44   // 获取默认设置的长度
45   cout << "Length of line : " << line.getLength() <<endl;
46   // 再次设置长度
47   line.setLength(6.0);
48   cout << "Length of line : " << line.getLength() <<endl;
49
50   return 0;
51}
52
53

C++基础知识

 

给TA打赏
共{{data.count}}人
人已打赏
安全技术

详解Node.js API系列 Http模块(2) CNodejs爬虫实现

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索